ME32F103 RISC开发板提供了ADC检测功能,并在数码管的配合下可直接将采集的电压值显示出来以供观察。
图1和图2是针对PA0引脚所进行的电压检测,可见其在悬空状态的电压值可达3288mV,而在接地状态下则可0V。
图1 悬空状态检测
图2 接地状态检测
在外接NTC热敏电阻模块的情况下,则可进行温度的检测,其电路如图3所示。
图3测温电路
此时,若对室温进行检测为2.146V,见图4所示。
图4 室温检测
若对体温进行检测,则可见到电压值会随着温度的升高而下降,见图5所示。
图5 体温检测
在检测值正确的情况下,如下的程序会显示出检测的温度值:
- // 0 1 2 3 4 5 6 7 8 9 dp hei
- uint8_t led[12]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x80,0x00};
- uint32_t adcvalue,adcvaluetemp,number;
- uint32_t u,v;
- int main(void)
- {
- // 数码管初始化程序
- // ADC初始化程序
- while(1)
- {
- ADC_IssueSoftTrigger;
- while(!ADC_IsScanDone);
- ADC_ClrState;
- adcvalue=ADC->DR0 & 0xFFF;
- adcvalue=(3300*adcvalue)>>12;
- u=adcvalue;
- 。。。
- if ((u<=1644) && (u>1268))
- {
- v=10+(1644-u)/37; // 10度区间检测
- }
- if ((u<=1268) && (u>947))
- {
- v=20+(1268-u)/32; // 20度区间检测
- }
- if ((u<=947) && (u>692))
- {
- v=30+(947-u)/25; // 30度区间检测
- }
- 。。。
- number=v%10;
- LED_Fill(COM3,led[number],0xFF);
- number=v%100/10;
- LED_Fill(COM2,led[number],0xFF);
- number=v%1000/100;
- LED_Fill(COM1,led[number],0xFF);
- LED_Fill(COM0,led[11],0xFF);
- SYS_Delay(0x7ffff);
- }
- }
但稍感不足的是,数码管显示的电压值会比用电压表检测的值要高许多,若数码管显示的是2.1V,则用万用表测得的电压约在1.2V左右。这就严重地影响了检测的效果,估计可能是因为电压输入端缺少运放的高输入电阻阻隔有关。