步进电机模块
今天打算学习下步进电机模块,用到了五线四相28BYJ4步进电机和ULN2003驱动板,借此来学习下PWM。
一.PWM
1.简介:
脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量、通信到功率控制与变换的许多领域中。
2.两个要素
频率:
指1秒钟内信号从高电平到低电平再回到高电平的次数(一个周期);单位为赫兹(Hz)。
然后就离不开周期:周期(T) = 1 / 频率(f)
举个简单的例子:50Hz = 20ms一个周期,如果频率为50Hz ,也就是说一个周期是20ms 那么一秒钟就有 50次PWM周期
占空比:
一个脉冲周期内,高电平的时间与整个周期时间的比例,单位为%(0%-100%)。
脉宽时间(高电平时间)占总周期时间(一个脉冲信号的时间)的比例,就是占空比。
3.原理
通俗的讲PWM就是脉冲宽度调制 通过调节占空比,就可以调节脉冲宽度(脉宽时间) 而频率 就是单位时间内脉冲信号的次数,频率越大。
PWM模式有两个模式,边沿对齐模式和中央对齐模式,边沿对齐模式又分为向上计数配置和向下计数配置,我们主要使用到向上对齐配置。
向上计数配置
- 在PWM输出模式下,除了CNT(计数器当前值)、ARR(自动重装载值)之外,还多了一个值CCRx(捕获/比较寄存器值)。
- 当CNT小于CCRx时,TIMx_CHx通道输出低电平;
- 当CNT等于或大于CCRx时,TIMx_CHx通道输出高电平。
PWM的一个周期
- 定时器从0开始向上计数
- 当0-t1段,定时器计数器TIMx_CNT值小于CCRx值,输出低电平
- t1-t2段,定时器计数器TIMx_CNT值大于CCRx值,输出高电平
- 当TIMx_CNT值达到ARR时,定时器溢出,重新向上计数...循环此过程
- 至此一个PWM周期完成
总结:
- 每个定时器有四个通道,每一个通道都有一个捕获比较寄存器,
- 将寄存器值和计数器值比较,通过比较结果输出高低电平,便可以实现脉冲宽度调制模式(PWM信号)
- TIMx_ARR寄存器确定PWM频率,
- TIMx_CCRx寄存器确定占空比
解析:
若计数配置脉TIMx_CNT为冲器向上计数,而重载寄存器TIMx_ARR配置为N,即TIMx_CNT的当前计数值数值X在TIMxCLK时钟源的驱动下不断累加,当TIMx_CNT的数值X大于N时,会重置TIMx_CNT数值为0重新计数。
而在TIMxCNT计数的同时,TIMxCNT的计数值X会与比较寄存器TIMx_CCR预先存储了的数值A进行比较,当脉冲计数器TIMx_CNT的数值X小于比较寄存器TIMx_CCR的值A时,输出高电平(或低电平),相反地,当脉冲计数器的数值X大于或等于比较寄存器的值A时,输出低电平(或高电平)。
如此循环,得到的输出脉冲周期就为重载寄存器TIMx_ARR存储的数值(N+1)乘以触发脉冲的时钟周期,其脉冲宽度则为比较寄存器TIMx_CCR的值A乘以触发脉冲的时钟周期,即输出PWM的占空比为A/(N+1)。
所以在我们使用的时候可以根据以下的两个公式来配置我们要使用的频率和占空比:
PWM频率:
Fpwm =Tclk / ((arr+1)*(psc+1))(单位:Hz)
- arr 是计数器值
- psc 是预分频值
占空比:
- duty circle = TIM3->CCR1 / arr(单位:%)
- TIM3->CCR1 用户设定值
即修改CCR1可以修改占空比,修改arr可以修改频率
二.任务一 :PWM实现呼吸灯
1.设置RCC
2.设置定时器
Channel1~4 就是设置定时器通道的功能 (输入捕获、输出比较、PWM输出、单脉冲模式)
- Mode 选择PWM模式1
- Pulse(占空比值) 先给0
- Fast Mode PWM脉冲快速模式:和我们配置无关,不使能
- PWM 极性: 设置为低电平 PS: 由于LED是低电平点亮,所以我们把极性设置为low
在 Parameter Settings 页配置预分频系数为 71,计数周期(自动加载值)为 499,定时器溢出频率,即PWM的周期。
3.设置USART
因为我只用的串口烧录程序,所以需要USART使能。
4.时钟树设置
5.代码编写
/* USER CODE BEGIN 1 */
uint16_t pwmVal=0; //PWM占空比
uint8_t dir=1;
/* USER CODE END 1 */
/* USER CODE BEGIN 2 */
HAL_TIM_PWM_Start(&htim3,TIM_CHANNEL_1);
/* USER CODE END 2 */
while (1)
{
/* USER CODE END WHILE */
while (pwmVal< 500)
{
pwmVal++;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
while (pwmVal)
{
pwmVal--;
__HAL_TIM_SetCompare(&htim3, TIM_CHANNEL_1, pwmVal); //修改比较值,修改占空比
// TIM3->CCR1 = pwmVal; 与上方相同
HAL_Delay(1);
}
HAL_Delay(200);
/* USER CODE BEGIN 3 */
}
三.步进电机
1.步进电机介绍
步进电机28BYJ-48名称含义:
28:表示步进电机的有效最大外径为28毫米
B:表示步进电机“步”字汉语拼音首字母
Y:表示永磁式“永”字汉语拼音首字母,永磁式表示转子为永磁体
J:表示减速型“减”字汉语拼音首字母
BYJ:组合即为永磁式减速步进电机
48:表示四相八拍,后续介绍
5V:表示额定电压为5V,且为直流电压
2.工作原理
步进电机是一种将电脉冲信号转换成相应角位移或线位移的电动机。每输入一个脉冲信号,转子就转动一个角度或前进一步,其输出的角位移或线位移与输入的脉冲数成正比,转速与脉冲频率成正比。
工作方式:四拍驱动,八拍驱动。
四拍驱动
八拍驱动
查阅28BYJ-48的手册,其步距角是5.625/64度,减速比是1/64。
控制步进电机,说白了就是控制GPIO的高低电平。
肯定会有人问为啥要叫步进电机,因为步进电机是按一步一步走的,它每一步前进的角度是5.625度,这是转子转动的角度,因为它是一个减速比为64:1的电机,所以转子每转动5.625°,外围转轴转动5.625/64°,因为转动一圈为360度°,所以这个电机在四相八拍的工作模式下转动一圈需要4096步,如果在四相四拍的工作模式下转动一圈为四相八拍的一半,即2048步。
三. 电机驱动板
由于单片机IO口输出电流过小,无法带动电机运行,因此我们需要另外加一个驱动板,我用的ULN2003。