温控PID调节PWM输出

PWM有两个重要参数:占空比和频率。
(1)占空比不多讲,由PID计算得出。
(2)另一个重要的参数就是频率(尽管不能计算出这个值到底是多少,但也不能随意设置)
原因:
1.频率过高:开关损耗增大,发热严重。
2.频率过低:输出响应速度变慢,系统达到稳定的时间增长。

1)低频工作状态:
1.原理:电热丝:通电,就加热;断电,就不加热。因此,用PWM控制开关器件,调节PWM的占空比就可以达到调节通电时间和断电时间的目的。
2.原因:因为在频率很低的情况下,电热丝的通电时间或者断电时间就会变得很长。(例如:如果通电时间长,则断电时间就会相应的缩短)
通电时间长:电热丝产生的热量就会很多
断电时间长:电热丝发热量不够。(电热丝开始加热,温度还未回升可能电热丝就断电了。)
2)中高频工作状态:(常用中频20K)
1.原理:改变PWM占空比,可改变电热丝的端电压。
2.例如:调低占空比,那么高电平时间减小,故而电热丝两端电压降低,则发热量降低。

  • 1
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是基于STM32F10x单片机实现的PID算法温度控制PWM输出的代码示例: ```c #include "stm32f10x.h" #include "PWMOUT.h" #define PWM_PIN GPIO_Pin_0 #define PWM_PORT GPIOA #define PWM_CLK RCC_APB2Periph_GPIOA #define TEMP_PIN GPIO_Pin_1 #define TEMP_PORT GPIOA #define TEMP_CLK RCC_APB2Periph_GPIOA #define TEMP_ADC ADC1 #define TEMP_ADC_CLK RCC_APB2Periph_ADC1 #define TEMP_ADC_CHANNEL ADC_Channel_1 #define PWM_FREQ 1000 // PWM频率为1kHz #define PWM_PERIOD 1000 // PWM周期为1ms #define PWM_MAX_DUTY 900 // PWM最大占空比为90% #define PWM_MIN_DUTY 100 // PWM最小占空比为10% #define TEMP_SETPOINT 50 // 设定温度为50℃ #define KP 2.0 // 比例系数 #define KI 0.5 // 积分系数 #define KD 0.1 // 微分系数 volatile uint16_t temp_value = 0; // 温度传感器采集值 volatile uint16_t pwm_duty = 0; // PWM占空比 volatile float error = 0; // 误差 volatile float last_error = 0; // 上一次误差 volatile float integral = 0; // 积分项 volatile float derivative = 0; // 微分项 void GPIO_Configuration(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(PWM_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = PWM_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(PWM_PORT, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(TEMP_CLK, ENABLE); GPIO_InitStructure.GPIO_Pin = TEMP_PIN; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; GPIO_Init(TEMP_PORT, &GPIO_InitStructure); } void ADC_Configuration(void) { ADC_InitTypeDef ADC_InitStructure; RCC_APB2PeriphClockCmd(TEMP_ADC_CLK, ENABLE); ADC_InitStructure.ADC_Mode = ADC_Mode_Independent; ADC_InitStructure.ADC_ScanConvMode = DISABLE; ADC_InitStructure.ADC_ContinuousConvMode = ENABLE; ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None; ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right; ADC_InitStructure.ADC_NbrOfChannel = 1; ADC_Init(TEMP_ADC, &ADC_InitStructure); ADC_RegularChannelConfig(TEMP_ADC, TEMP_ADC_CHANNEL, 1, ADC_SampleTime_239Cycles5); ADC_Cmd(TEMP_ADC, ENABLE); ADC_ResetCalibration(TEMP_ADC); while(ADC_GetResetCalibrationStatus(TEMP_ADC)); ADC_StartCalibration(TEMP_ADC); while(ADC_GetCalibrationStatus(TEMP_ADC)); } void TIM_Configuration(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD - 1; TIM_TimeBaseStructure.TIM_Prescaler = SystemCoreClock / (PWM_FREQ * PWM_PERIOD) - 1; TIM_TimeBaseStructure.TIM_ClockDivision = 0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM2, &TIM_TimeBaseStructure); TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = 0; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; TIM_OC1Init(TIM2, &TIM_OCInitStructure); TIM_Cmd(TIM2, ENABLE); } void SysTick_Handler(void) { static uint16_t count = 0; if(count++ >= 10) // 100ms采集一次温度 { count = 0; ADC_SoftwareStartConvCmd(TEMP_ADC, ENABLE); while(!ADC_GetFlagStatus(TEMP_ADC, ADC_FLAG_EOC)); temp_value = ADC_GetConversionValue(TEMP_ADC); error = TEMP_SETPOINT - temp_value; integral += error; derivative = error - last_error; last_error = error; pwm_duty = KP * error + KI * integral + KD * derivative; if(pwm_duty > PWM_MAX_DUTY) pwm_duty = PWM_MAX_DUTY; if(pwm_duty < PWM_MIN_DUTY) pwm_duty = PWM_MIN_DUTY; TIM_SetCompare1(TIM2, pwm_duty); } } int main(void) { GPIO_Configuration(); ADC_Configuration(); TIM_Configuration(); SysTick_Config(SystemCoreClock / 1000); // 1ms中断一次 while(1); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值