void vTaskAnalogInExe(void *pvParameter)//ANALOG_TIME_CH
{
struct ad7124_dev tAd7124; //设备结构体
int aiTemperatureCode[4][2] = {0};//温度码值
double faRtdRes[4] = {0};//RTD电阻值
float faTemperature[4] = {0};
float faGain[4] = {0.99999,1.0024,1.0024,1};
uint8_t count = 0;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3 | GPIO_Pin_2;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_ResetBits(GPIOA,GPIO_Pin_3);
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
tAd7124.regs = ad7124_regs; //指定寄存器表
tAd7124.check_ready = 0; //是否读取内部准备标志
tAd7124.use_crc = AD7124_DISABLE_CRC;//不进行CRC
tAd7124.spi_rdy_poll_cnt = 1000; //超时计数
tAd7124.psw_flag = 0; //内部开关标志
tAd7124.delay_callback = vTaskDelay; //注册内部使用的延时函数
if(ad7124_reset(&tAd7124) != 0)
App_Printf(0,"RstErr\r\n");
/* 设置ADC控制寄存器 */
tAd7124.regs[AD7124_ADC_Control].value |= (AD7124_ADC_CTRL_REG_REF_EN | //内部参考电压输出使能
AD7124_ADC_CTRL_REG_MODE(4) | //进入空闲模式
AD7124_ADC_CTRL_REG_POWER_MODE(2) |//全功率
AD7124_ADC_CTRL_REG_CLK_SEL(0) //内部614.4K
);
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_ADC_Control]);
App_Printf(0,"ctrl:%#x\r\n",tAd7124.regs[AD7124_ADC_Control].value);
for(int i = 0;i<4;i++)
{
//设置配置寄存器
tAd7124.regs[AD7124_Config_0+i].value &= ~(AD7124_CFG_REG_BIPOLAR | //单极性
AD7124_CFG_REG_PGA(0x7) |
AD7124_CFG_REG_REF_SEL(0x3));
tAd7124.regs[AD7124_Config_0+i].value |= (AD7124_CFG_REG_PGA(3) | //增益8
AD7124_CFG_REG_REF_SEL(0) | //参考选择 REFIN1(+)/REFIN1(?)
AD7124_CFG_REG_REF_BUFM | //REFINx(-)缓冲打开
AD7124_CFG_REG_REF_BUFP | //REFINx(+)缓冲打开
AD7124_CFG_REG_AIN_BUFP | //AINP缓冲打开
AD7124_CFG_REG_AINN_BUFM); //AINM缓冲打开
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Config_0+i]); //写入配置寄存器
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Config_0+i]);
App_Printf(0,"c%d:%#x\r\n",i,tAd7124.regs[AD7124_Config_0+i].value);
//设置滤波器寄存器
tAd7124.regs[AD7124_Filter_0+i].value &= ~AD7124_FILT_REG_FS(0x7FF);
tAd7124.regs[AD7124_Filter_0+i].value |= AD7124_FILT_REG_FS(30); //设置通道输出数据速率 15:1280 SPS
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Filter_0+i]); //写入滤波器寄存器
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Filter_0+i]);
App_Printf(0,"f%d:%#x\r\n",i,tAd7124.regs[AD7124_Filter_0+i].value);
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Gain_0+i]);
tAd7124.regs[AD7124_Gain_0+i].value *= faGain[i];
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Gain_0+i]);
//设置通道寄存器
tAd7124.regs[AD7124_Channel_0+i].value &= ~(AD7124_CH_MAP_REG_CH_ENABLE |//默认关闭通道
AD7124_CH_MAP_REG_AINM(0x1f) |
AD7124_CH_MAP_REG_AINP(0x1f) |
AD7124_CH_MAP_REG_SETUP(0x7));
tAd7124.regs[AD7124_Channel_0+i].value |= (AD7124_CH_MAP_REG_AINM(1+i*4) |//设置通道负极管脚,对应原理图1、5、9、13
AD7124_CH_MAP_REG_AINP(2+i*4) | //设置通道正极管脚,对应原理图2、6、10、14
AD7124_CH_MAP_REG_SETUP(i)); //设置通道使用的配置寄存器和滤波寄存器
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Channel_0+i]); //设置配置寄存器1
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Channel_0+i]);
App_Printf(0,"ch%d:%#x\r\n",i,tAd7124.regs[AD7124_Channel_0+i].value);
}
//设置错误寄存器,使能参考检测功能
tAd7124.regs[AD7124_Error_En].value |= AD7124_ERREN_REG_REF_DET_ERR_EN; //使能参考监测
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_Error_En]); //设置ADC控制寄存器
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error_En]);
App_Printf(0,"err_en:%#x\r\n",tAd7124.regs[AD7124_Error_En].value);
for(;;)
{
switch(count)//设置通道的管脚和测试电流
{
case 0:
ad7124_ch_ctrl(&tAd7124,0,1); //打开通道
ad7124_set_cur(&tAd7124,0,AD7124_IOUT_500UA,3,AD7124_IOUT_500UA);//IOUT0->INT0:500mA,IOUT1->INT3:500mA
tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1); //启动转换
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
GPIOA->BSRR = (1 << 3);
if(ad7124_wait_to_conv_ready(&tAd7124,10000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[0][0]);
}
GPIOA->BSRR = (1 << (3 + 16));
ad7124_set_cur(&tAd7124,3,AD7124_IOUT_500UA,0,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
GPIOA->BSRR = (1 << 3);
if(ad7124_wait_to_conv_ready(&tAd7124,10000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[0][1]);
}
GPIOA->BSRR = (1 << (3 + 16));
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
{
App_Printf(0,"ref err0 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
}
ad7124_ch_ctrl(&tAd7124,0,0); //关闭通道
faRtdRes[0] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[0][0]);//转换电阻值
if(PT100_ResistanceToTemp(faRtdRes[0],&faTemperature[0]) == PT100_OK)//转换温度
{
// App_Printf(0,"t0=%.3f\r\n",faTemperature[0]);
}
break;
case 1:
ad7124_ch_ctrl(&tAd7124,1,1); //打开通道
ad7124_set_cur(&tAd7124,4,AD7124_IOUT_500UA,7,AD7124_IOUT_500UA);//IOUT0->INT4:500mA,IOUT1->INT7:500mA
tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1); //启动转换
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[1][0]);
}
ad7124_set_cur(&tAd7124,7,AD7124_IOUT_500UA,4,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[1][1]);
}
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
{
App_Printf(0,"ref err1 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
}
ad7124_ch_ctrl(&tAd7124,1,0); //关闭通道
faRtdRes[1] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[1][0]);
if(PT100_ResistanceToTemp(faRtdRes[1],&faTemperature[1]) == PT100_OK)
{
// App_Printf(0,"t1=%.3f\r\n",faTemperature[1]);
}
break;
case 2:
ad7124_ch_ctrl(&tAd7124,2,1); //打开通道
ad7124_set_cur(&tAd7124,8,AD7124_IOUT_500UA,11,AD7124_IOUT_500UA);//IOUT0->INT8:500mA,IOUT1->INT11:500mA
tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1); //启动转换
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[2][0]);
}
ad7124_set_cur(&tAd7124,11,AD7124_IOUT_500UA,8,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[2][1]);
}
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
{
App_Printf(0,"ref err2 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
}
ad7124_ch_ctrl(&tAd7124,2,0); //关闭通道
faRtdRes[2] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[2][0]);
if(PT100_ResistanceToTemp(faRtdRes[2],&faTemperature[2]) == PT100_OK)
{
// App_Printf(0,"t2=%.3f\r\n",faTemperature[2]);
}
break;
case 3:
ad7124_ch_ctrl(&tAd7124,3,1); //打开通道
ad7124_set_cur(&tAd7124,12,AD7124_IOUT_500UA,15,AD7124_IOUT_500UA);//IOUT0->INT8:500mA,IOUT1->INT11:500mA
tAd7124.regs[AD7124_ADC_Control].value &= ~AD7124_ADC_CTRL_REG_MODE(0xF);
tAd7124.regs[AD7124_ADC_Control].value |= AD7124_ADC_CTRL_REG_MODE(1); //启动转换
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[3][0]);
}
ad7124_set_cur(&tAd7124,15,AD7124_IOUT_500UA,12,AD7124_IOUT_500UA);//IOUT0->INT3:500mA,IOUT1->INT0:500mA
ad7124_write_register(&tAd7124,tAd7124.regs[AD7124_ADC_Control]); //设置ADC控制寄存器
if(ad7124_wait_to_conv_ready(&tAd7124,1000) == 0)//等待转换完成
{
ad7124_read_data(&tAd7124,&aiTemperatureCode[3][1]);
}
ad7124_read_register(&tAd7124,&tAd7124.regs[AD7124_Error]);
if(tAd7124.regs[AD7124_Error].value & AD7124_ERR_REG_REF_DET_ERR)
{
App_Printf(0,"ref err3 :%#x\r\n",tAd7124.regs[AD7124_Error].value);
}
ad7124_ch_ctrl(&tAd7124,3,0); //打开通道
faRtdRes[3] = adc_code_to_rtd_resistance_double(&aiTemperatureCode[3][0]);
if(PT100_ResistanceToTemp(faRtdRes[3],&faTemperature[3]) == PT100_OK)
{
// App_Printf(0,"t3=%.3f\r\n",faTemperature[3]);
}
break;
}
vTaskDelay(50);
if(++count == 4)
{
count = 0;
GPIOA->ODR ^= (1 << 2);
App_Printf(0,"t0=%.3f,t1=%.3f,t2=%.3f,t3=%.3f\r\n",faRtdRes[0],faRtdRes[1],faRtdRes[2],faRtdRes[3]);
// App_Printf(0,"t0=%.3f,t1=%.3f,t2=%.3f,t3=%.3f\r\n",faTemperature[0],faTemperature[1],faTemperature[2],faTemperature[3]);
count = 0;
}
// vTaskDelay(10);
// vTaskDelay(1000);
}
}
现在我遇到的问题是:
1)使用外部电压基准监控的时候,这个监控生效的状态十分奇怪,按照手册所说的,外部断开或者基准低于0.7就会置位,但是我打开通道和电流源之后,循环读取错误寄存器,关闭通道,基准电压检测一直报错,只有进行一次转换之后,才不会触发这个错误
2) pt100未接时,触发了基准电压检测,按照手册所示,转换过后的数据应该是0xffffff,但是我打印查看并非如此,只是会偶尔变成0xffffff,很多时候是0
3)进行4个通道读取的时候,如果通道3的pt100没有接,通道0读取的时候,可以读取到数值,但是也会触发基准电压检测,1.2通道不会,并且通道0的数据受到影响,如果通道0未接,那么就是通道1会触发基准电压检测,数据会被影响
另外,我使用逻辑分析仪抓取协议的时候,发现通道0 读取状态寄存器判断是否转换完成的时候,发现低三位一直指示的前一个通道,直到转换完成的那一帧数据才是通道0的,其他通道也是一样
