本帖最后由 jinglixixi 于 2023-2-16 12:07 编辑
在APM32F107片内配有多通道的ADC模数转换器,通过它采集外部的模拟信号,其输出效果如图1至图3所示。
图1 悬空状态下采集结果
图2 检测3.3V信号
图3 检测GND信号
为此,可在其基础上提供添加热敏电阻来实现温度检测,其电路构成如图4所示。 该温度检测信号所连接的引脚为PA0,即通道0。 图4 温度检测电路
图5 温度检测效果
对ADC的初始化函数为: - void ADC_Init(void)
- {
- GPIO_Config_T gpioConfig;
- ADC_Config_T adcConfig;
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_GPIOA);
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.mode = GPIO_MODE_ANALOG;
- gpioConfig.pin = GPIO_PIN_0;
- GPIO_Config(GPIOA, &gpioConfig);
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
- ADC_Reset(ADC1);
- ADC_ConfigStructInit(&adcConfig);
- adcConfig.mode = ADC_MODE_INDEPENDENT;
- adcConfig.scanConvMode = ENABLE;
- adcConfig.continuosConvMode = ENABLE;
- adcConfig.externalTrigConv = ADC_EXT_TRIG_CONV_None;
- adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
- adcConfig.nbrOfChannel =1;
- ADC_Config(ADC1, &adcConfig);
- RCM_ConfigADCCLK(RCM_PCLK2_DIV_4);
- ADC_ConfigRegularChannel(ADC1, ADC_CHANNEL_0, 1, ADC_SAMPLETIME_13CYCLES5);
- DMA_Init();
- ADC_EnableDMA(ADC1);
- ADC_Enable(ADC1);
- ADC_ResetCalibration(ADC1);
- while(ADC_ReadResetCalibrationStatus(ADC1));
- ADC_StartCalibration(ADC1);
- while(ADC_ReadCalibrationStartFlag(ADC1));
- ADC_EnableSoftwareStartConv(ADC1);
- }
进行温度检测的函数为: - void ADC_Channel_0 (void)
- {
- float voltage,u;
- uint8_t index;
- uint16_t V;
- voltage = (adcData[0] * 3300.0 ) / 4095.0;
- u=voltage;
- if((u<=1644)&&(u>1268)) V=10+(1644-u)/37;
- if((u<=1268)&&(u>947)) V=20+(1268-u)/32;
- if((u<=947)&&(u>692)) V=30+(947-u)/25;
- OLED_ShowNum(60,4,V,3,16);
- }
实现显示效果的主程序为: - int main(void)
- {
- ADC_Init();
- APM_MINI_OLEDInit();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(20,0,"APM32F107",16);
- OLED_ShowString(20,2,"NTC test",16);
- OLED_ShowString(20,4,"temp= C",16);
- while(1)
- {
- ADC_Channel_0 ();
- Delay(1000);
- }
- }
这样利用ADC的数据采集功能同热敏电阻NTC及OLED屏相结合,就可实现一个温度检测装置。
|