|
这一期给大家带来的是利用评估板上的热电阻(RTD)进行温度检测,不过不同的是检测RTD的电压值没有进行最后的温度换算。为了是测量值更精准一些,采用的是差分模式。先看一下热电阻部分的电路图。
如上图所示,J6和J7要短接起来。然后从AIN0端给一个正输入,给AIN1端口一个负输入,然后测量两个端口之间的差值即为测量值。当然需要给AIN6一个恒流源的输入,以便计算出电压值。分析完原理后就可以进行编程了。首先还是贴出来ADC的初始化函数。
void ADC1_Init(){ AdcGo(pADI_ADC1,ADCMDE_ADCMD_IDLE); AdcMski(pADI_ADC1,ADCMSKI_RDY,1); AdcFlt(pADI_ADC1,124,14,FLT_NORMAL|ADCFLT_NOTCH2|ADCFLT_CHOP); AdcRng(pADI_ADC1,ADCCON_ADCREF_INTREF,ADCMDE_PGA_G32,ADCCON_ADCCODE_INT); AdcBuf(pADI_ADC1,ADCCFG_EXTBUF_OFF,ADCCON_BUFBYPN|ADCCON_BUFBYPP|ADCCON_BUFPOWP|ADCCON_BUFPOWN); AdcPin(pADI_ADC1,ADCCON_ADCCN_AIN1,ADCCON_ADCCP_AIN0); AdcGo(pADI_ADC1,ADCMDE_ADCMD_CONT); NVIC_EnableIRQ(ADC1_IRQn); <br>选用的是ADC1,程序的第一行是将ADC1设置为空闲模式,以便于开始读取新值。下一行是使能ADC1的中断准备,接着是设置滤波,设置ADC 的输入范围,选择内部参考值,选择增益是32。然后下面一行是关闭输入缓冲和外部参考,接着就是选择AIN0的正输入和AIN1的负输入,然后启动ADC1的连续转换模式,最后就是使能ADC1的中断。然后是恒流源的初始化函数。
void IEXC_Init(){ IexcDat(IEXCDAT_IDAT_200uA,IDAT0En); IexcCfg(IEXCCON_PD_off,IEXCCON_REFSEL_Int,IEXCCON_IPSEL1_Off,IEXCCON_IPSEL0_AIN6);}恒流源的初始化函数第一行是设置200uA的电流输出,提供给热电阻,然后设置AIN6为电流输出端。接着就可以写ADC1的中断函数,子函数先贴出来。void ADC1_Int_Handler (){ volatile unsigned int uiADCSTA = 0; uiADCSTA = pADI_ADC1->STA; ulADC1Result = AdcRd(pADI_ADC1); bSendResultToUART = 1; }读取ADC1的状态寄存器,然后从ADC的结果寄存器中读取转换值。最后一行就是发送数据的判断标志。然后开始编写ADC采样的子函数,老规矩,贴出来函数。void StartTem(){ if (bSendResultToUART == 1) { bSendResultToUART = 0; fVolts = fVoltage; fVolts = (1.2 / 268435456); fVoltage = (ulADC1Result * fVolts); if(Tab[0]==0x03) { printf ("Temputer=%f V\r\n",fVoltage ); Tab[0]=0x00; Tab[1]=0x00; Tab[2]=0x00; } } }首先清除掉发送数据的标志位,接下来就是计算ADC的采样电压了,最后输出电压值并清空数组。然后在主函数中调用初始化函数,并在while循环中使用温度采集函数,这样就可以在串口中通过发送指令测得热电阻两端的电压了。 |
|