一、PWM简介(Pulse width modulation)
1.定义:PWM,就是脉冲宽度调制,也就是占空比可变的脉冲波形。
2.适用条件:PWM所应用的场景必须为惯性系统,像led,当立即变为低电平时,led并不会瞬间熄灭,而是具有惯性,在短时间内为逐渐熄灭。
3.应用:智能车,机器人等项目。呼吸灯、驱动电机等。
二、频率
频率为Ts的倒数,频率越大,则等效模拟信号越平稳。(即输出的方波整体上较为密集)
三、占空比(Duty Ratio)
1.定义:占空比指在一个脉冲循环内,通电时间相对于总时间所占的比例。(或者说在一个周期中,高电平的时间占整个周期的时间)
2.计算:D=Ton/Ts(Ton为一个周期内高电平的时间、Ts为高低电平变换周期的时间)
3.作用:频率一定时,可以通过改变占空比来调节电压。
例如高电平为5V,低电平为0V时,占空比为80%时,可以看作为4/5处的电压,即4V。
四、分辨率
1.定义:是指PWM最小能设定到的高电平时间所占周期的比例,即最小占空比。
2.在一个时钟下,若降低频率,则周期变大,分辨率增大。
五、STM32使用pwm
1.输出比较OC(Output Compare)
如图
流程:在进行CNT与CCR比较后,其结果在经过输出比较电路后,通过TIM_CH1输出到GPIO引脚上。
原理:通过进行对CNT计数器与CCR捕获比较寄存器的比较,来输出一个电平不断跳变的PWM方波。
每当CNT=RCC时,就会进行一次电平翻转,CNT>CCR且小于ARR(即在一个周期内)时输出高电平。
2.输出比较电路
原理:当CNT大于或等于CCR时,传输信号至控制器,后改变其输出的电平。
3.通用计时器
通用计时器共有4个RCC寄存器,且他们公用一个CNT计数器。
六、通过STM32输出50%占空比的PWM
1.思路
1.RCC开启时钟(GPIO和TIM)
2.选择时基单元的时钟源(定时中断选择内部时钟源)
3.配置时基单元(预分频器、自动重装器、计数模式)
4.配置CCR的值、输出比较模式、极性选择、输出使能的等参数
5.配置GPIO(PWM对应的GPIO使用复用推挽输出模式)
2.代码(PWM.c)
void PWM_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure);
//GPIO初始化
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);//开启通用定时器TIM2的时钟
TIM_InternalClockConfig(TIM2);//选择时基单元的时钟(默认使用内部时钟)
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;//指定时钟分频,1表示不分频
//滤波器作用:滤掉信号的抖动干扰
//滤波器原理:在一个固定的时钟频率f下采样,若连续N个采样点电平一致,表示输入信号稳定,则输出
//若N个采样点电平不相同,表示信号有抖动,则直接输出低电平或输出上一次的电平
//采样频率由内部时钟直接来或由内部时钟加时钟分频来
TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//计数器模式(向上/向下/中间3个)
TIM_TimeBaseInitStructure.TIM_Period=100-1;//周期(10K的频率下计1w个数即为1s)(ARR)
TIM_TimeBaseInitStructure.TIM_Prescaler=720-1;//预分频器(72M对7200分频,得到10K的计数频率)(PSC)
TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器(高级计数器才有)
TIM_TimeBaseInit(TIM2,&TIM_TimeBaseInitStructure);//初始化结构体
TIM_OCInitTypeDef TIM_OCInit_InitStructure;
TIM_OCStructInit(&TIM_OCInit_InitStructure);//给结构体赋初值,以免对高级定时器等造成干扰
TIM_OCInit_InitStructure.TIM_OCMode=TIM_OCMode_PWM1;//设置输出比较的模式
//TIM_OCMode_Timing 冻结模式
//TIM_OCMode_Active 相等时置有效电平
//TIM_OCMode_Inactive 相等时置无效电平
//TIM_OCMode_Toggle 相等时电平翻转
//TIM_OCMode_PWM1 PW1模式
//TIM_OCMode_PWM2 PW2模式
TIM_OCInit_InitStructure.TIM_OCPolarity=TIM_OCPolarity_High;//设置输出比较的极性
//TIM_OCPolarity_High 极性不翻转,REF有效是高电平,REF有效时输出高电平
//TIM_OCPolarity_Low REF电平取反,有效电平为低电平
TIM_OCInit_InitStructure.TIM_OutputState=ENABLE;//设置输出使能
TIM_OCInit_InitStructure.TIM_Pulse=50;//设置CCR
TIM_OC1Init(TIM2,&TIM_OCInit_InitStructure);
//初始化输出比较单元
TIM_Cmd(TIM2,ENABLE);//启动定时器
}
3.计算
文章来源:https://www.toymoban.com/news/detail-706518.html
4.示波器检测
文章来源地址https://www.toymoban.com/news/detail-706518.html
到了这里,关于STM32使用PWM的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!