基于AD5933的阻抗测量仪
{
xishu=(1/(21.006)); //计算系数
xishu=(1/(xishu*valu))*100000000+0.5; //计算阻值 ll=xishu; i=1; } break;
case 6:
if((valu<4800)&&(valu>800))
{
xishu=(1/(96.527914)); //计算系数 xishu=(1/(xishu*valu))*100000000+0.5; //计算阻值 ll=xishu; i=1; }
break;
default:
break; }
if(i==1) //满足条件则显示阻值,相位 {
a[0]=ll/10000000+48;
a[1]=ll000000/1000000+48; a[2]=ll00000/100000+48; a[3]=ll0000/10000+48;
a[4]=ll000/1000+48; a[5]='.';
a[6]=ll00/100+48; a[7]=ll0/10+48; a[8]=ll0+48; a[9]='K'; a[10]=0;
LCD_WriteStr(4,2,a);
regist=ll;
if((y==0)&&(x==0))
{
//计算并显示 atan2(float y, float x); 求y/x(弧度表示)的反正切值 xishu=atan2(imvalu,revalu)*180/3.14+0.5; }
if((y==1)&&(x==0))
{
//计算并显示 atan2(float y, float x); 求y/x(弧度表示)的反正切值 xishu=atan2((imvalu*(-1)),revalu)*180/3.14-0.5;
基于AD5933的阻抗测量仪
xishu=xishu+180;
}
if((y==1)&&(x==1)) {
//计算并显示 atan2(float y, float x); 求y/x(弧度表示)的反正切值 xishu=atan2(imvalu,revalu)*180/3.14+0.5; xishu=xishu+180; }
if((y==0)&&(x==1))
{
xishu=atan2(imvalu,(revalu*(-1)))*180/3.14-0.5; atan2(float y, float x); 求y/x(弧度表示)的反正切值
xishu=xishu+360; }
if((ll<1000)&&(ll>400)) //相位误差修正 ll=xishu-89.5;
if((ll<10000)&&(ll>=1000))
ll=xishu-(-0.0012237*regist+91.46)+0.5; if((ll<100000)&&(ll>=10000))
ll=xishu-(-0.0001515*regist+91.016)+0.5; if((ll<1000000)&&(ll>=100000))
ll=xishu-(-0.0000179*regist+91.806)+0.5; if((ll<=2000000)&&(ll>=1000000))
ll=xishu-(-0.000009675*regist+93.789)+0.5; if((ll<12000000)&&(ll>2000000))
ll=xishu-(-0.00000256*regist+95.444)+0.5; if(ll<0) //判断正负 {
ll=ll*(-1); a[0]='-';
a[1]=ll/100+48; a[2]=ll0/10+48; a[3]=ll0+48; a[4]=0;
LCD_WriteStr(4,3,a); } else {
a[0]=' '; a[1]=ll/100+48; a[2]=ll0/10+48; a[3]=ll0+48; a[4]=0;
LCD_WriteStr(4,3,a);
//计算并显示
基于AD5933的阻抗测量仪
}
} }
//---------------------------------------------------------------------------------------------------------------------
// 函数原形:ReadData(unsigned char addr) // 功能描述:读数据函数。
// 参数说明:unsigned char addr 子地址 // 返回值:数据
//---------------------------------------------------------------------------------------------------------------------
unsigned int ReadData(unsigned char addr) //读数据
{
unsigned int data_a;
ISend(AD5933_addr,SET_POINT,addr); delays(5);
data_a=IRcv(AD5933_addr); delays(5); return data_a; }
//---------------------------------------------------------------------------------------------------------------------
// 函数原形:void wendu(void) // 功能描述:温度测量函数。
// 参数说明:无。 // 返回值:无
//---------------------------------------------------------------------------------------------------------------------
void wendu(void)
{
unsigned char Status,a[3]; unsigned int Tm; //复位AD5933
ISend(AD5933_addr,0x81,0x10); delays(5);
ISend(AD5933_addr,0x81,0x00); delays(5);
//启动温度测量
ISend(AD5933_addr,0x80,0x91); delays(5);
//等待转换完成
基于AD5933的阻抗测量仪
do
{
Status=ReadData(0x8F); }while(!(Status & 0x01));
Tm=ReadData(0x92); Tm<<=8;
Tm+=ReadData(0x93);
Tm=Tm&0x3FFF;
Tm=Tm/32; //温度换算并且显示 a[0]=Tm0/10+48; a[1]=Tm0+48; a[2]=0;
LCD_WriteStr(4,1,a); }
//---------------------------------------------------------------------------------------------------------------------
// 函数原形:void sweepfre(void)
// 功能描述:测量函数 // 参数说明:无。 // 返回值:无
//---------------------------------------------------------------------------------------------------------------------
void sweepfre(void)
{
unsigned char Status=0,count; signed int Re=0,Im=0;
InitAD5933(); //初始化AD5933 do {
Status=ReadData(0x8F); }while(!(Status & 0x02)); //读回阻抗的实部 Re=ReadData(0x94); delays(5);
Re=Re<<8;
Re+=ReadData(0x95); delays(5);
//读回阻抗的虚部 Im=ReadData(0x96); delays(5); Im=Im<<8;
基于AD5933的阻抗测量仪
Im+=ReadData(0x97);
delays(5); display(Re,Im); }
//--------------------------------------------------------------------------------------------------------------- // 函数原形:int main(void) // 功能描述:主函数。 // 参数说明:无。 // 返回值:无
//--------------------------------------------------------------------------------------------------------------- int main(void) {
unsigned char data;
// 设置晶振为系统时钟
SysCtlClockSet(SYSCTL_SYSDIV_10 | SYSCTL_USE_PLL | SYSCTL_OSC_MAIN | SYSCTL_XTAL_6MHZ);
// 使能本例所使用的外设。
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB); SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOD);
// 配置相关引脚,以进行I2C操作,初始化LED指示灯。
GPIODirModeSet(GPIO_PORTB_BASE, SDA | SCL | SDAA|
SCLL,GPIO_DIR_MODE_OUT);
GPIODirModeSet(GPIO_PORTD_BASE, SDAye | SCLye |
CSye|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7, GPIO_DIR_MODE_OUT);
lcdInit(); //液晶初始化 LCD_WriteStr(1,1,\温度:\ LCD_WriteStr(1,2,\幅值:\ LCD_WriteStr(1,3,\相位:\ LCD_WriteStr(6,3,\度\ LCD_WriteStr(5,1,\度\
while(1) {
wendu(); //测量温度 for(j=0;j<7;j++) {
if(j==2)
continue;
GPIOPinWrite(GPIO_PORTD_BASE,0xe0, j<<5); //选着通道 sweepfre(); //扫描并计算阻抗 } }