本帖最后由 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屏相结合,就可实现一个温度检测装置。
|