系列文章目录
提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加
例如:第一章 Python 机器学习入门之pandas的使用
提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档
。
前言
目前学习单片机是为了参加各种的机器人比赛,而PWM是控制舵机和电机法宝,在经过一段时间的学习后准备作一下总结,也方便之后的查询。
一、什么是PWM波
脉冲宽度调制(PWM)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
——百度
是不是看不懂呢,我也看不懂,我们只需要了解在单片机当中PWM有什么用就好了,见过呼吸灯吧就是那种渐渐变亮渐渐变暗的那种,还有舵机的方向的控制,电机转动方向和速度的控制都离不开PWM,而这也是我们在单片机中使用PWM的原因。
二、代码示例
1.32中利用定时器TIM1的通道1输出PWM
代码如下(示例):
# include "pwm.h"
// 通过查数据手册得到 TIM1的通道一的默认GPIO是PA8
void PWM_INIT(u16 arr,u16 psc){ // (arr+1)(psc+1)/72M 周期的计算公式
GPIO_InitTypeDef GPIO_InitStructure; //GPIO口初始化设置
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; //计时器初始化设置结构体
TIM_OCInitTypeDef TIM_OCInitStructure; // 定时器通道初始化结构体
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); //使能计数器1时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA , ENABLE); //使能GPIOA时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出,输出TIM1 CH1 的PWM波形
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//GPIO口速率
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化
TIM_TimeBaseStructure.TIM_Period = arr; //自动重装载值
TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频系数
TIM_TimeBaseStructure.TIM_ClockDivision = 0;
TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; // 技 术模式向上计数
TIM_TimeBaseInit(TIM1, &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(TIM1, &TIM_OCInitStructure); //初始化
TIM_CtrlPWMOutputs(TIM1,ENABLE);//MOE主输出使能
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //预装载使能
TIM_ARRPreloadConfig(TIM1, ENABLE); //使能TIM1在ARR 上的预装载寄 存器
TIM_Cmd(TIM1, ENABLE); //使能TIM 1
//TIM_SetCompare1(TIM1,5)//比较函数
}
2.使用解析
不管上面我写的PWM模块代码还是其他的情况,我们不需要完完整整的知道从头到尾怎么写,我们要做的是在能够灵活的利用这些基础的代码,并在这个基础上进行修改实现更复杂的代码。
在主函数中,我们通过定义重装载值和预分频系数来改变PWM波的周期,TIM_SetCompare1(TIM1,N)利用这个比较函数来改变占空比。