STM32嵌入式开发PWM波控制舵机
创作时间:
作者:
@小白创作中心
STM32嵌入式开发PWM波控制舵机
引用
1
来源
1.
https://bbs.21ic.com/icview-3425596-1-1.html
掌握STM32嵌入式开发和PWM技术,可以为各种项目和应用提供精准控制外设的能力。无论是机器人控制、四轴飞行器、智能家居等领域,都可以运用PWM技术实现对各种外设的控制。通过本文的学习,您将能够掌握使用STM32进行PWM波控制舵机的方法,从而为您的嵌入式开发项目增加更多的功能和灵活性。
一、PWM波是什么?
PWM(Pulse Width Modulation,脉宽调制)波是一种电子信号调制技术,用于控制电路的输出功率。它通过改变信号的脉冲宽度,来调节电路的平均输出电压或电流。
舵机
二、使用步骤
1. PWM.C
代码如下(示例):
#include "stm32f10x.h" // Device header
/**
* 函数名称:PWM_Init
* 功能描述:初始化PWM输出配置
* 输入参数:无
* 返回值:无
*/
void PWM_Init(void)
{
/* 开启定时器TIM2和GPIOA端口的时钟 */
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE); // 开启TIM2定时器的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); // 开启GPIOA端口的时钟
/* GPIO初始化 */
GPIO_InitTypeDef GPIO_InitStructure;
// 配置PA1为复用推挽输出模式(AF_PP),用于PWM信号输出
// 设置最大速率为50MHz
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; //可增加引脚控制多个舵机
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOA, &GPIO_InitStructure); // 应用上述配置到GPIOA
/* 配置定时器时钟源 */
TIM_InternalClockConfig(TIM2); // 选择TIM2使用内部时钟作为计数时钟,默认即为此选项
/* 时基单元初始化 */
TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;
// 定义并配置定时器的基本参数
TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1; // 不分频
TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; // 向上计数模式
TIM_TimeBaseInitStructure.TIM_Period = 20000 - 1; // 计数周期(ARR)设为19999,即每计数20000次溢出一次
TIM_TimeBaseInitStructure.TIM_Prescaler = 72 - 1; // 预分频系数设为71,使定时器频率为系统时钟频率除以72
TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0; // 重复计数器,仅对高级定时器有效
TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure); // 应用上述配置到TIM2
/* 输出比较通道初始化 */
TIM_OCInitTypeDef TIM_OCInitStructure;
TIM_OCStructInit(&TIM_OCInitStructure); // 初始化结构体变量为默认值
// 配置PWM输出特性
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; // 使用PWM模式1
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; // 高电平有效
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; // 输出使能
TIM_OCInitStructure.TIM_Pulse = 0; // 初始脉冲宽度为0,即占空比为0%
//TIM_OC2Init,这个通道也要更改
TIM_OC2Init(TIM2, &TIM_OCInitStructure); // 应用上述配置到TIM2的通道2
/* 使能定时器 */
TIM_Cmd(TIM2, ENABLE); // 使能TIM2,开始PWM波形生成
}
/**
* 函数名称:PWM_SetCompare2
* 功能描述:设置PWM的CCR2寄存器值,从而调整PWM波形的占空比
* 输入参数:Compare - 要写入CCR2寄存器的值,范围是0到ARR(即20000-1)
* 返回值:无
* 注意事项:此函数只改变CCR2的值,并不直接设定占空比。占空比由公式Duty = CCR / (ARR + 1)决定。
*/
void PWM_SetCompare2(uint16_t Compare)
{
//TIM_SetCompare2,通道要更改
TIM_SetCompare2(TIM2, Compare); // 设置TIM2通道2的CCR2寄存器值
}
2. Servo.c
代码如下(示例):
#include "stm32f10x.h" // 包含STM32F10x系列微控制器的头文件
#include "PWM.h" // 包含自定义的PWM库文件
/**
* 函数名称:Servo_Init
* 功能描述:初始化舵机所用的PWM功能
* 输入参数:无
* 返回值:无
*/
void Servo_Init(void)
{
PWM_Init(); // 调用PWM初始化函数,配置PWM输出,用于控制舵机
}
/**
* 函数名称:Servo_SetAngle
* 功能描述:根据给定的角度值设置舵机的位置
* 输入参数:Angle - 指定舵机要转动到的角度,范围为0到180度
* 返回值:无
* 注意事项:此函数假设输入的角度值在合法范围内(0-180度),并且通过线性变换将角度映射到对应的PWM占空比。
*/
void Servo_SetAngle(float Angle)
{
// 确保角度在合理范围内
if (Angle < 0) Angle = 0;
if (Angle > 180) Angle = 180;
// 将角度转换为相应的CCR值,这里假设:
// - 角度0对应500us的高电平时间
// - 角度180对应2500us的高电平时间
// PWM周期为20ms(即频率为50Hz),因此使用线性比例计算中间角度的高电平时间
PWM_SetCompare2((uint16_t)(Angle / 180.0 * 2000 + 500));
}
3. main.c
#include "stm32f10x.h" // STM32头文件
#include "oled.h" // OLED屏头文件
#include "key.h" // 按键头文件
#include "Servo.h" // 舵机头文件
// 定义角度变量
float Angle = 0; // 初始化为0度
int main(void)
{
// 系统初始化
OLED_Init(); // OLED屏初始化
OLED_Clear(); // 清屏
Servo_Init(); // 舵机初始化
// 显示初始信息
OLED_ShowString(0, 0, "Press Key to Increase Angle");
while (1)
{
// 检测按键是否按下
if (KEY_Scan(0) == KEY_ON) // 假设有一个按键扫描函数返回按键状态
{
// 角度递增,但不超过180度
Angle += 30;
if (Angle > 180)
{
Angle = 180; // 限制最大角度为180度
}
// 设置舵机角度
Servo_SetAngle(Angle);
// 在OLED上显示当前角度
OLED_Clear();
char angleStr[16];
sprintf(angleStr, "Angle: %.0f", Angle);
OLED_ShowString(0, 1, angleStr); // 显示当前角度
// 等待一段时间以避免按键抖动或多次触发
Delay_ms(200); // 假设有延时函数Delay_ms()
}
}
}
总结
在STM32中,可以使用定时器模块的PWM输出功能实现控制多个PWM信号。以下是操作多个PWM的总结步骤:
- 初始化定时器:根据需要选择一个合适的定时器模块(如TIM1、TIM2等),并进行相应的初始化配置,包括时钟源、预分频因子、计数模式等。
- 配置PWM输出通道:选择定时器的一个或多个输出通道作为PWM输出通道,并设置相应的工作模式。可用的工作模式包括PWM模式、单脉冲模式、电平模式等。
- 设置PWM周期:通过调整定时器的自动重载寄存器(ARR)的值来设置PWM的周期。ARR的值决定了一个PWM周期的持续时间。
- 设置PWM占空比:通过调整定时器的比较寄存器(CCR)的值来设置PWM的占空比。CCR的值决定了PWM的高电平持续时间。
- 启动定时器:使能定时器的输出功能,启动定时器的计数。
- 更新PWM信号:根据需要,可以通过更新ARR和CCR的值来改变PWM周期和占空比。可以使用定时器的中断或DMA等方式来定期更新这些值,以实现PWM信号的动态调整。
需要注意的是,在操作多个PWM信号时,可能会存在定时器资源的限制。不同的STM32芯片具有不同数量的定时器模块和输出通道,需要根据具体芯片的规格来选择合适的定时器和通道。此外,还需要根据具体的应用需求来调整PWM的周期和占空比,以满足控制要求。可以通过计算得到合适的周期和占空比值,或者通过试错法进行调整。
热门推荐
《CS:GO》低成本打淬火的炼金配方
利比里亚可可产业:从战后废墟到复兴之路
猪油擦脸的功效与作用
Excel里如何使用ln函数?如何计算自然对数?
【知识拓展】音视频中的推流与拉流
深度学习中的学习率调整策略:优化模型训练的关键
曹操就任兖州牧后和黄巾军对阵并未获胜,反而被黄巾军大败
宾利:插混受宠,推迟2030年全面电动化目标
婚房灯光设计:营造温馨浪漫氛围的关键
神枪手西蒙海耶,三个月狙杀敌方五百人,被苏联士兵称为白色死神
买空买多是什么意思?这种交易策略如何影响市场波动?
经济十强省排位赛:广东霸榜首36年,上海反超湖南晋级前十
恋与深空祁煜角色背景详细介绍
实现教育公平:关注资源分配与家庭支持,共同努力助力每个孩子成长
数据库设计中如何实现对数据的实时监控
螺旋钢管与直缝钢管:性能与应用的全面对比
5G-A云手机:领跑5G-A时代数智生活新体验
如何在改善房屋潮湿问题时采取有效的措施?这些措施的实施需要注意哪些方面?
智能制造装备技术就业方向及前景:大专毕业能去干什么
Steam游戏评测 第136期《深岩银河》
黄金价格盎司与克的换算如何进行?这些换算方法对投资者有何帮助?
《源氏物语》说的是什么故事?《源氏物语》内容详解
轨道灯维修指南:常见故障及解决方法
家庭养狗的必须药品有哪些
如何利用ATR指标在交易中设置理想止损点?
白银为什么表现疲软?市场供需关系如何影响其价格?
观赏鱼如何增色养殖(如何通过饲料配比来提高观赏鱼的颜色)
贫血诊断全解析:从血常规指标读懂贫血
散热风扇:提升电子产品性能与可靠性的关键
上海看PET-CT最好的医院是哪家?五家顶尖医院详解