最近做智能家居的小demo,不论是舵机模拟窗帘、电机模拟风扇以及台灯的模拟,都用到了PWM波,后面可能还会试着开发小车啊这些,也会用到PWM波,所以这里记录一下自己的理解。
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
频率:单位Hz 在pwm中指1s内信号从高电平到低电平又回到高电平的次数
周期:单位s 频率分之一
占空比:是一个脉冲周期内,高电平的时间与整个周期时间的比例,单位: %
例:周期的时间是10ms,高电平时间是8ms 那么低电平时间就是2ms 总的占空比 8/(8+2)= 80%
PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大
在脉冲信号中,占空比是指一个脉冲周期内高电平所占的时间比例。如果一个脉冲信号的频率为20Hz,且占空比为80%,那么这意味着在一个脉冲周期内,高电平的时间为0.8倍的周期时间,而低电平的时间为0.2倍的周期时间。
假设一个脉冲信号的周期为T,那么它的频率和周期之间的关系可以用以下公式表示:
频率 = 1 / 周期
所以,周期T = 1 / 频率
现在,我们可以用这个公式来计算高电平的时间:
高电平时间 = 0.8 × 周期T
= 0.8 × (1 / 频率)
= 0.8 / 频率
将频率=20Hz代入上式,得到:
高电平时间 = 0.8 / 20Hz = 40ms
因此,对于一个20Hz、占空比为80%的脉冲信号,每次输出的脉冲信号的高电平时间为40ms。这意味着在1秒钟之内,会输出20次这样的脉冲信号。
以单片机为例,我们知道,单片机的IO口输出的是数字信号,IO口只能输出高电平和低电平
假设高电平为5V 低电平则为0V 那么我们要输出不同的模拟电压,就要用到PWM,通过改变IO口输出的方波的占空比从而获得使用数字信号模拟成的模拟电压信号
比方说 占空比为50% 那就是高电平时间一半,低电平时间一半,在一定的频率下,就可以得到模拟的2.5V输出电压 那么75%的占空比 得到的电压就是3.75V
及在单片机中改变占空比就可以改变IO口输出的电压大小
这里用的是HT32,stm32也是一样,都是用定时器产生PWM波
周期 = (计数器重装载值 + 1) / 预分频系数
根据下面代码的设置
计数器重装载值 = 200-1 = 199
预分频系数 = 4800-1 = 4799
周期 = (199 + 1) / 4799 = 20ms
//产生一个20ms 定时周期
void GPTM_PWM_init(void)
{
TM_TimeBaseInitTypeDef TimeBaseIniture; //结构体
TM_OutputInitTypeDef OutIniture;
CKCU_PeripClockConfig_TypeDef CKCUClock = {{0}};
CKCUClock.Bit.PA = 1; //GPIOA时钟打开
CKCUClock.Bit.AFIO = 1; //复用时钟
CKCUClock.Bit.GPTM0 = 1;
CKCU_PeripClockConfig(CKCUClock, ENABLE); //时钟使能
AFIO_GPxConfig(GPIO_PA, GPIO_PIN_6, AFIO_MODE_4); //开启复用功能
GPIO_DirectionConfig(HT_GPIOA,HTGPIO_PIN,GPIO_DIR_OUT);
TM_ClearFlag(HT_GPTM0, TM_FLAG_UEV); //清除更新中断标志
TM_OutputStructInit(&OutIniture); //填写每个变量的默认值
//定时器时基以及计数方式初始化
TimeBaseIniture.CounterMode = TM_CNT_MODE_UP; //边沿对齐向上模式
TimeBaseIniture.CounterReload = 200-1; //计数重装载计数器
TimeBaseIniture.Prescaler = 4800 -1; //预分频系数
TimeBaseIniture.PSCReloadTime=TM_PSC_RLD_IMMEDIATE; //立即重装载
TM_TimeBaseInit(HT_GPTM0,&TimeBaseIniture);
// 2通道输出 PA6
OutIniture.Channel=TM_CH_2;
OutIniture.Control=TM_CHCTL_ENABLE; //GPTM通道使能
OutIniture.OutputMode=TM_OM_PWM1; //GPTM 通道 PWM1输出模式 PWM2模式翻转
OutIniture.Polarity=TM_CHP_INVERTED; //GPTM 通道极性是低电平或下降沿
//OutIniture.Compare=200; // 这个是配置占空比的
TM_OutputModeConfig(HT_GPTM0,TM_CH_2,TM_OM_PWM1);
TM_OutputInit(HT_GPTM0,&OutIniture);
TM_IntConfig(HT_GPTM0, TM_INT_CH0CC|TM_INT_CH1CC|TM_INT_CH2CC|TM_INT_CH3CC, ENABLE); //中断
TM_Cmd(HT_GPTM0,ENABLE); //使能计数
}
总之,PWM就是在合适的信号频率下,通过一个周期里改变占空比的方式来改变输出的有效电压