[活动] 【APM32M3514开发板测评】+基于NTC检测的温度控制器

[复制链接]
 楼主| jinglixixi 发表于 2025-1-20 22:49 | 显示全部楼层 |阅读模式
本帖最后由 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.jpg

图1 显示用引脚

温度设置是使用板载的电位器,由PA7输入模拟信号,见图2所示。
2.jpg
图2 电位器连接

NTC温度模块则是连接到PA3(HALL A),以检测温度变化,其电路如图3所示。
2.jpg
图3  NTC模块连接

在完成了引脚资源的分配后,下面以软件来实现其功能设计。
对2个ADC指定通道的初始化函数为:
  1. void ADC_Init (void)
  2. {
  3. GPIO_Config_T gpioConfig;
  4. ADC_Config_T adcConfig;
  5. RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOA);
  6. GPIO_ConfigStructInit(&gpioConfig);
  7. gpioConfig.mode = GPIO_MODE_AN;
  8. gpioConfig.pupd = GPIO_PUPD_NO;
  9. gpioConfig.pin = GPIO_PIN_3 |GPIO_PIN_7;
  10. GPIO_Config(GPIOA, &gpioConfig);
  11. RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC);
  12. ADC_Reset();
  13. ADC_ConfigStructInit(&adcConfig);
  14. adcConfig.resolution = ADC_RESOLUTION_12B;
  15. adcConfig.scanDir = ADC_SCAN_DIR_UPWARD;
  16. adcConfig.convMode = ADC_CONVERSION_CONTINUOUS;
  17. adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
  18. adcConfig.extTrigEdge1 = ADC_EXT_TRIG_EDGE_NONE;
  19. adcConfig.extTrigConv1 = ADC_EXT_TRIG_CONV_TRG0;
  20. ADC_Config(&adcConfig);
  21. ADC_ConfigChannel(ADC_CHANNEL_3, ADC_SAMPLE_TIME_239_5);
  22. ADC_ConfigChannel(ADC_CHANNEL_7, ADC_SAMPLE_TIME_239_5);
  23. DMA_Init();
  24. ADC_ReadCalibrationFactor();
  25. ADC_EnableDMA();
  26. ADC_DMARequestMode(ADC_DMA_MODE_CIRCULAR);
  27. ADC_Enable();
  28. }

对2个通道进行数据采集和控制处理的函数为:
  1. void ADC_MultiChannelPolling(void)
  2. {
  3.     float voltage;
  4.     uint8_t index;
  5.     uint16_t W,P,O;
  6.     for (index = 0; index < 2; index++)
  7.     {
  8.                   voltage = (adcData[index] * 3300.0) / 4095.0;
  9.                   if(index == 1)
  10.                   {                                 
  11.                          OLED_ShowNum(40,2,(voltage-1540),4,16);
  12.                          O=bh(voltage-1540);
  13.                          OLED_ShowNum(40,4,O,4,16);           
  14.                          if(O<P)
  15.                         {
  16.                                    GPIO_ClearBit(GPIOA, GPIO_PIN_12);
  17.                                    OLED_ShowString(0,0,"ON",16);
  18.                         }
  19.                         else
  20.                         {
  21.                                    GPIO_SetBit(GPIOA, GPIO_PIN_12);
  22.                                    OLED_ShowString(0,0,"OF",16);
  23.                         }
  24.                   }
  25.                   if(index == 2)
  26.                   {
  27.                             W=bh(voltage);
  28.                             P=W;
  29.                             OLED_ShowNum(40,6,W,4,16);
  30.                   }
  31.     }
  32. }


实现数据采集与显示的测试主程序为:
  1. int main(void)
  2. {
  3.     APM_MINI_Init();
  4.     ADC_Init();
  5.     OLED_Init();
  6.     OLED_Clear();
  7.     OLED_ShowString(0,2,"ch3:      mV",16);
  8.     OLED_ShowString(0,4,"NTC:      C",16);
  9.     OLED_ShowString(0,6,"set:      C",16);
  10.     while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));
  11.     ADC_StartConversion();
  12.     while (1)
  13.     {
  14.         ADC_MultiChannelPolling();
  15.         APM_DelayMs(500);
  16.     }
  17. }


经程序的编译和下载,其执行效果如图4和图5所示,即使用是通过电位器来设置温度的限定值,在采集到NTC的温度值后,经比较来控制D7指示灯来指示控制状态。当温度低于温度限定值时,D7点亮表示处于加热状态;当温度高于温度限定值时,则D7熄灭表示停止加热。
该处理方式巧妙地利用双通道A/D检测,以电位器取代了常规的按键设置温度限定值的方式,简单地旋动旋钮即搞定设置问题。
4.jpg
图4 进行加热


5.jpg
5 关闭加热

   


  
 楼主| jinglixixi 发表于 2025-1-20 23:30 | 显示全部楼层
需注意的是,使用PA3对NTC进行温度检测会受到板载器件的一定影响,电压值会偏大一些,在允许对开发板进行修改的情况下,可去掉该通道的外围器件。
遗忘领域 发表于 2025-1-22 10:11 | 显示全部楼层
实现的比较好
 楼主| jinglixixi 发表于 2025-1-22 14:57 | 显示全部楼层

感谢支持!!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部

518

主题

2933

帖子

39

粉丝
快速回复 在线客服 返回列表 返回顶部