打印
[活动]

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

[复制链接]
46|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 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 关闭加热

   


  

使用特权

评论回复
沙发
jinglixixi|  楼主 | 2025-1-20 23:30 | 只看该作者
需注意的是,使用PA3对NTC进行温度检测会受到板载器件的一定影响,电压值会偏大一些,在允许对开发板进行修改的情况下,可去掉该通道的外围器件。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

471

主题

2801

帖子

38

粉丝