本帖最后由 jinglixixi 于 2025-1-20 23:11 编辑
#申请原创#
@21小跑堂
尽管APM32M3514开发板是一款面向电机控制的开发工具,但不妨利用它的片内资源配置设计出具有鲜明特点的作品。这里就介绍一种利用2个通道的A/D数据采集功能来实现一个以电位器来设置调节温度,以NTC进行温度检测的温度控制器。 首先是进行引脚资源的分配,其详细情况如下: OLED屏使用PC4和PC5,其中SCLK连接PC4、SDIN连接PC5,见图1所示。 所用PA3(HALL A)连接NTC模块以检测温度值
图1 显示用引脚
温度设置是使用板载的电位器,由PA7输入模拟信号,见图2所示。
图2 电位器连接
NTC温度模块则是连接到PA3(HALL A),以检测温度变化,其电路如图3所示。
图3 NTC模块连接
在完成了引脚资源的分配后,下面以软件来实现其功能设计。 对2个ADC指定通道的初始化函数为: - void ADC_Init (void)
- {
- GPIO_Config_T gpioConfig;
- ADC_Config_T adcConfig;
- RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
- GPIO_ConfigStructInit(&gpioConfig);
- gpioConfig.mode = GPIO_MODE_AN;
- gpioConfig.pupd = GPIO_PUPD_NO;
- gpioConfig.pin = GPIO_PIN_3 |GPIO_PIN_7;
- GPIO_Config(GPIOA, &gpioConfig);
- RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC);
- ADC_Reset();
- ADC_ConfigStructInit(&adcConfig);
- adcConfig.resolution = ADC_RESOLUTION_12B;
- adcConfig.scanDir = ADC_SCAN_DIR_UPWARD;
- adcConfig.convMode = ADC_CONVERSION_CONTINUOUS;
- adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
- adcConfig.extTrigEdge1 = ADC_EXT_TRIG_EDGE_NONE;
- adcConfig.extTrigConv1 = ADC_EXT_TRIG_CONV_TRG0;
- ADC_Config(&adcConfig);
- ADC_ConfigChannel(ADC_CHANNEL_3, ADC_SAMPLE_TIME_239_5);
- ADC_ConfigChannel(ADC_CHANNEL_7, ADC_SAMPLE_TIME_239_5);
- DMA_Init();
- ADC_ReadCalibrationFactor();
- ADC_EnableDMA();
- ADC_DMARequestMode(ADC_DMA_MODE_CIRCULAR);
- ADC_Enable();
- }
对2个通道进行数据采集和控制处理的函数为: - void ADC_MultiChannelPolling(void)
- {
- float voltage;
- uint8_t index;
- uint16_t W,P,O;
- for (index = 0; index < 2; index++)
- {
- voltage = (adcData[index] * 3300.0) / 4095.0;
- if(index == 1)
- {
- OLED_ShowNum(40,2,(voltage-1540),4,16);
- O=bh(voltage-1540);
- OLED_ShowNum(40,4,O,4,16);
- if(O<P)
- {
- GPIO_ClearBit(GPIOA, GPIO_PIN_12);
- OLED_ShowString(0,0,"ON",16);
- }
- else
- {
- GPIO_SetBit(GPIOA, GPIO_PIN_12);
- OLED_ShowString(0,0,"OF",16);
- }
- }
- if(index == 2)
- {
- W=bh(voltage);
- P=W;
- OLED_ShowNum(40,6,W,4,16);
- }
- }
- }
实现数据采集与显示的测试主程序为: - int main(void)
- {
- APM_MINI_Init();
- ADC_Init();
- OLED_Init();
- OLED_Clear();
- OLED_ShowString(0,2,"ch3: mV",16);
- OLED_ShowString(0,4,"NTC: C",16);
- OLED_ShowString(0,6,"set: C",16);
- while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
- ADC_StartConversion();
- while (1)
- {
- ADC_MultiChannelPolling();
- APM_DelayMs(500);
- }
- }
经程序的编译和下载,其执行效果如图4和图5所示,即使用是通过电位器来设置温度的限定值,在采集到NTC的温度值后,经比较来控制D7指示灯来指示控制状态。当温度低于温度限定值时,D7点亮表示处于加热状态;当温度高于温度限定值时,则D7熄灭表示停止加热。 该处理方式巧妙地利用双通道A/D检测,以电位器取代了常规的按键设置温度限定值的方式,简单地旋动旋钮即搞定设置问题。
图4 进行加热
图5 关闭加热
|
|