本帖最后由 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 关闭加热
|