打印
[应用相关]

STM32标准库PWM编写

[复制链接]
384|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tpgf|  楼主 | 2024-11-6 16:57 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
1、PWM
1.1  简介
PWM(Pulse Width Modulation)脉冲宽度调制

在具有惯性的系统中,可以通过对一系列脉冲的宽度进行调制,来等效地获得所需要的模拟参量,常应用于电机控速等领域。

PWM的参数: 频率  ,    占空比           分辨率 = 占空比变化步距

以单片机为例,单片机的 IO 口输出的是数字信号,IO口只能输出高电平和低电平





电压是以一种连接1或断开0的重复脉冲序列被夹到模拟负载上去的(例如LED灯,直流电机等),连接即是直流供电输出,断开即是直流供电断开。通过对连接和断开时间的控制,理论上来讲,可以输出任意不大于最大电压值(即0~5V之间任意大小)的模拟电压。

PWM的调节作用来源于对“占周期”的高电平时间控制,“占周期”变长,输出的能量就会提高,通过阻容变换电路所得到的平均电压值也会上升,“占周期”变短,输出的电压信号的电压平均值就会降低,通过阻容变换电路所得到的平均电压值也会下降。

因此:在一定的频率下,通过不同的占空比 即可得到不同的输出模拟电压

2.1  定时器的PWM模式实现
将TIM的输出比较模式设为PWM1,当计数器CNT开始计数时有以下两种模式:

        向上计数:CNT<CCR时,REF置有效电平,CNT≥CCR时,REF置无效电平

        向下计数:CNT>CCR时,REF置无效电平,CNT≤CCR时,REF置有效电平

因此可以实现上述的PWM的功能。






2、PWM实现
2.1 步骤
        1、 RCC 初始化开启时钟 ——> 需要使用的TIM和GPIO的外设工作时钟都打开,
        2、 初始化GPIO,将PWM对应的GPIO口,初始化为复用推挽输出,
        3、 选择定时器的时基单元的时钟源、配置时基单元,
        4、 配置输出比较单元(OC):包括输出比较模式、极性选择、输出使能,CCR的值、
        5、 定时器使能,运行控制

2.2 程序实现
void PWM_TIM1_Init(uint16_t PSC, uint16_t PRE)
{
        //开启时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
       
        //初始化GPIO
        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
        GPIO_InitStruct.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOA, &GPIO_InitStruct);
       
        //初始化TIM
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;       
        TIM_TimeBaseStructInit(&TIM_TimeBaseInitStruct);
        TIM_TimeBaseInitStruct.TIM_ClockDivision = TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode = TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Prescaler = PSC - 1;                //PSC:预分频器,即PSC的值
        TIM_TimeBaseInitStruct.TIM_Period = PRE - 1;                //ARR:计数周期,即ARR的值
        TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStruct);

        //初始化OC
        TIM_OCInitTypeDef TIM_OCInitStruct;
        TIM_OCStructInit(&TIM_OCInitStruct); //结构体初始化,若结构体没有完整赋值。
                                         //则最好执行此函数,给结构体所有成员都赋一个默认值
        TIM_OCInitStruct.TIM_OCMode = TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OCPolarity = TIM_OCPolarity_High;                //输出的极性
        TIM_OCInitStruct.TIM_OutputState = TIM_OutputState_Enable;        //输出的状态:使能 或 失能
        TIM_OCInitStruct.TIM_Pulse = 0;//初始的CCR值
       
        TIM_OC1Init(TIM1, &TIM_OCInitStruct);        //配置PWM的输出通道
        TIM_OC4Init(TIM1, &TIM_OCInitStruct);
       
        //配置PWM输出
        TIM_CtrlPWMOutputs(TIM1, ENABLE);        //仅在高级定时器使用, 输出PWM时需要调用这个函数,
                                        //使能输出
        //OC--pre-load-config--使能
        TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);        //自动装载
        TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);        //
               
        TIM_ARRPreloadConfig(TIM1, ENABLE);        //ARR
       
        TIM_Cmd(TIM1, ENABLE);
}
3、实现功能
3.1  LED呼吸灯
设置对应的GPIO口的模式

void LED_Init(void)
{
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);

        GPIO_InitTypeDef GPIO_Initstructure;
        GPIO_Initstructure.GPIO_Mode =GPIO_Mode_Out_PP;
        GPIO_InitStruct.GPIO_Pin = GPIO_Pin_8 | GPIO_Pin_11;
        GPIO_Initstructure.GPIO_Speed = GPIO_Speed_50MHz;
       
        GPIO_Init(GPIOA, &GPIO_Initstructure);
}
在主函数中调用PWM的初始化函数:设置预分频PSC为7200,计数周期为100,

通过调用下面的函数来设置定时器的(捕获比较寄存器)CCR的值,来调节输出的PWM波的占空比。

TIM_SetCompare1(TIM1, compare);//设置CCR的值
当compare的值递减或递加时CCR的值发生变化,即可实现呼吸灯的功能。

3.2  控制舵机
舵机是一种根据输入 PWM 信号占空比来控制输出角度的装置
输入 PWM 信号要求:周期为 20ms ,高电平宽度为 0.5ms~2.5ms





根据舵机的输入要求将其周期扩大10倍,则调用PWM初始化函数设置PSC为7200,ARR为200

所其CCR设置的范围为 5~25 的范围内,因此调用下列函数,设置CCR,

TIM_SetCompare1(TIM1, compare);//设置CCR的值
输入compare = Angle / 180 * 20 + 15。

Angle为舵机的输出轴转角。
————————————————

                            版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

原文链接:https://blog.csdn.net/weixin_51328875/article/details/143414145

2256672b2a846b833.png (8.09 KB )

2256672b2a846b833.png

89538672b2f0e8526b.png (8.09 KB )

89538672b2f0e8526b.png

18819672b2f207292a.png (24.28 KB )

18819672b2f207292a.png

使用特权

评论回复
沙发
AdaMaYun| | 2024-11-11 17:25 | 只看该作者
STM32标准库PWM编写

使用特权

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

本版积分规则

1931

主题

15611

帖子

11

粉丝