首页 - 新闻 - stm32串口控制舵机旋转角度(stm32控制舵机正反转)

stm32串口控制舵机旋转角度(stm32控制舵机正反转)

2023-10-09 12:33

stm32串口控制舵机旋转角度(stm32控制舵机正反转)

如何使用STM32F1控制数字舵机?

1。你说的让我有点困惑。 pwm 的完整拼写是脉冲宽度调制。

如何让舵机正常转动

列表
1 STM32F103C8T6,1条Jlink下载线
1 MG90S舵机
12V电源,12V转5V降压模块(舵机供电)1
杜邦电线数量
MG90S舵机
如图,舵机有三根线,红色接5V正极,黑色接地;黄色是信号线,接收PWM信号
实物图
输出PWM控制舵机
STM32控制舵机。一般来说,它向伺服信号线发送周期为20ms的PWM(脉冲宽度调制)信号来控制转向角。 PWM 脉冲的占空比决定转向角。机器的角位置,对应关系如下图;
STM32依靠定时器TIM来实现PWM信号的输出。 STM32有多种定时器,分为通用定时器和高级定时器。每个通用定时器可以输出4路PWM,本文使用TM2_CH4,定时器2的第4个PWM;对应STM32F103C8T6上的PB11引脚;
创建工程输出PWM
本文使用STM32CubeMX创建工程,更加简单高效,即使你不熟悉单片机也能操作成功;
1。打开STM32CubeMX,新建一个工程,搜索并选择STM32F103C8,然后启动工程;
2。进行基本设置并配置 RCC、SYS、HCLK
RCC -> 设置高速外部时钟 HSE 选择外部时钟源
SYS -> 选择调试模式串行线
HCLK -> 设置为 72MHZ
3. 设置定时器
选择 TIM2
选择内部时钟源
设置 Channel4 为 PWM 模式
右侧相应引脚自动设置为复用模式
设置定时器参数
为了控制舵机,我们需要设置 PWM 输出一个周期为 20ms 的信号,定时器时钟为 72Mhz
设置预分频器为 720-1,则单周期为 72M/(Prescaler + 1 ) = 100Khz (0.01ms)
以 20ms 为周期,计数器周期为 20ms/0.01ms - 1 = 1999
这里可以设置默认脉冲宽度为 0.5ms,则 0.5/20*2000 = 50
4。接下来设置输出格式
添加工程名称PWM
将IDE修改为C中的MDK-ARM V5
在ode Genetator中设置包含的库和项目格式
现在STM32CubeMX已经设置完毕。接下来,生成代码并打开文件;
在主函数中启动定时器,输出一定的脉冲PWM信号来驱动舵机; 5. 修改代码
在 main.c 文件相应位置添加以下代码
启动 PWM 输出
输出 PWM 信号
/* USER CODE BEGIN 包括 */
# include "stdio.h"
/* 用户代码结束包括 */
/* 用户代码开始 2 */
HAL_TIM_PWM_Start(&htim2,TIM_CHANNEL_4); //启动定时器
int CompareValue = 15 0 ; //设置compareValue为50、150、250,分别对应0°、90°、180°
/* USER CODE END 2 */
/* 无限循环*/
/* USER CODE BEGIN WHILE */
while (1)
{
/* 用户代码结束 WHILE */
/* 用户代码开始 3 */
__HAL_TIM_SET_COMPARE(&htim2, TIM_CHANNEL _4 ,比较值); // 输出 PWM 信号
HAL_Delay(10);
}
/* USER CODE END 3 */
}
登录后复制

添加完成后以上代码,编译,然后通过JLink将程序加载到STM32F103C8T6中,将舵机信号线连接到PB11(TIM2_CHANNEL4)端口,并连接电源,舵机即可旋转到指定角度;从上面的定时器设置可以看出,compareValue值为50、150、250对应0.5ms、1.5ms、2.5ms对应0°、90°、180°;如果想让舵机连续转动,只需在50到250之间循环改变compareValue值即可;
6. 接线
开始 使用单片机的 5V 输出时舵机通电,舵机发出咔嗒声,但不转动。怀疑电源不强,单独供电后驱动成功;
JIink连接电脑和单片机,下载程序到单片机并给单片机供电
舵机为黄色信号线连接STM32F103C8T6引脚PB11,接收PWM信号
红色舵机电源线接稳压板正5V输出,舵机黑色地线需要接单片机的地
调试
实际操作中可能会出现这种情况 各种问题,这里介绍几种调试方法
1、伺服测试
调试模块一端接电源,一端接舵机。手动模式下,舵机会与旋钮同步转动,可用于测试舵机是否正常;
2.串口调试助手
可以下载串口调试助手,使用ttl转USB模块连接电脑,在特定位置打印出来,检查程序是否按照默认运行
stm32

找stm32控制四自由度舵机的程序

这应该通过串口发送数据信息。发送和接收都在信号线上。手头没有现成的程序。您可以看看这是否适用于其他网络。
最好按照手册自己写。
#include
#include
void InitUart0(void)
{
UCSR0A = 0x02; // 设置为双速模式
UBRR0H = 0;
UBRR0L = 1;
UCSR0B = (1< UCSR0C = (3< DDRE &= ~_BV(PE0) ; // 初始化RX口默认方向为输入
PORTE &= ~_BV(PE0); // 初始化RX口默认状态为高阻
DDRE |= _BV(PE1); // 初始化TX端口默认方向 用于输出
PORTE |= _BV(PE1); // 初始化TX口默认状态为高电平
DDRA |= _BV(PA0); // 初始化输出使能端口状态方向
PORTA & = ~_BV(PA0); // 初始化使能端口状态为RX状态
DDRA |= _BV(PA1); // 初始化使能端口状态方向输出
PORTA |= _BV(PA1); //初始化使能口状态为TX状态
}
void SendUart0Byte(unsigned char data)
{
while ( !( UCSR0A & (1< UDR0 = data;/* 将数据放入缓冲区并发送数据*/
}
void SetServoLimit(unsigned char id, unsigned Short int cw_limit, unsigned Short int ccw_limit)
{
无符号短整型 temp_ccw = 0; // 临时速度,用于判断方向
unsigned Short int temp_cw = 0;
unsigned char temp_ccw_h = 0; // 要发送的 h 位数据
unsigned char temp_ccw_l = 0; // L 位待发送数据
unsigned char temp_cw_h = 0;
unsigned char temp_cw_l = 0;
unsigned char temp_sum = 0; // 校验和注册变量
if ( ccw_limit > 1023)
{
temp_ccw = 1023; // 速度限制值在可用范围内
}
else
{
temp_ccw = ccw_limit;
}
if (cw_limit > 1023)
{
temp_cw = 1023;
}
else
{ temp_cw = cw_limit;
}
temp_ccw_h = (无符号字符)( temp_ccw >> 8);
temp_ccw_l = (无符号字符)temp_ccw; // 将16bit数据分割成两个8bit数据
temp_cw_h = (unsigned char)(temp_cw >> 8);
temp_cw_l = (unsigned char)temp_cw; // 将16bit数据分割成两个8bit数据
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 将总线置于主机发送状态
UCSR0A |= (1< SendUart0Byte(0xFF); // 开始发送Symbol 0xFF
SendUart0Byte(0xFF); // 发送起始符号0xFF
SendUart0Byte(id); // 发送id
SendUart0Byte(7); // 发送数据的长度为参数长度+2,参数长度为3
SendUart0Byte(0x03); // 命令数据为“WRITE DATA”
SendUart0Byte(0x06); // 舵机控制寄存器首地址
SendUart0Byte(temp_cw_l); // 发送顺时针位置限制低位 ? temp_sum = id + 7 + 0x03 + 0x06 + temp_cw_l + temp_cw_h + temp_ccw_l + temp_ccw_h;
temp_sum = ~temp_sum; // 计算校验和
SendUart0Byte(temp_sum); // 发送校验和
while ( !( UCSR0A & (1< { // (等待发送完成)
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 制作总线主机接收状态
_delay_ms(2); //传输完成后,总线会被从机占用,反馈响应数据,所以进行延时
}
void SetServoPosition(unsigned char id, unsigned Short int position, unsigned短整型
速度)
{
无符号短整型temp_velocity = 0; // 临时速度,用于方向判断
unsigned Short int temp_position = 0;
unsigned char temp_ve location_h = 0; // 发送数据H位置
Unsigned CHAR TEMP_VELOCITY_L = 0; // 用于发送数据L位
UnSIGNED CHAR TEMP_POSITION_H = 0;
无符号字符 TEMP_POSITION_L = 0;
未签名的chant_sum = 0; // 校验和注册变量
if (velocity > 1023)
{
temp_velocity = 1023; // 将速度值限制在可用范围内
}
else
{
temp_velocity = Velocity;
}
if (position > 1023)
{
临时位置= 1023;
}
else
{
temp_position = 位置;}
temp_velocity_h = (无符号字符)(temp_velocity >> 8); //分割16bit数据分成两个8bit数据
temp_velocity_l = (unsigned char)temp_velocity;
temp_position_h = (unsigned char)(temp_position >> 8);
//将16bit数据拆分成两个8bit数据
temp_position_l = (无符号字符)temp_position;
PORTA &= ~_BV(PA1);
PORTA |= _BV(PA0); // 将总线置于主机发送状态
UCSR0A |= (1<SendUart0Byte(0xFF); // 发送起始符号 0xFF
SendUart0Byte(0xFF); ; // 发送数据的长度为参数长度+2,参数长度为3
SendUart0Byte(0x03); // 命令数据为“WRITE DATA”
SendUart0Byte(0x1E); // 伺服控制寄存器首地址
SendUart0Byte(temp_position_l); //发送速度数据低字节
SendUart0Byte(temp_position_h); //发送速度数据高字节
SendUart0Byte(temp_velocity_l); //发送位置
SendUart0Byte(temp_velocity_h); // 发送位置高字节
temp_sum = id + 7 + 0x03 + 0x1E + temp_position_l + temp_position_h + temp_velocity_l +
temp_velocity_h;
temp_sum = ~temp_sum; // 计算校验和
SendUart0Byte( temp_sum); // 发送校验和 (发送校验和)
while ( !( UCSR0A & (1<{ // (等待发送完成)
;
}
PORTA |= _BV(PA1);
PORTA &= ~_BV(PA0); // 将总线置于主机接收状态
_delay_ms(2); // 传输完成后,总线会被从机占用,反馈响应数据,所以进行了延时
}
void S特(5); // 发送数据的长度为参数长度+2,参数长度为3
SendUart0Byte(0x03); // 命令数据为“WRITE DATA”
SendUart0Byte(0x20); // 伺服控制寄存器首地址
SendUart0Byte(temp_value_l); // 发送速度数据低位
SendUart0Byte(temp_value_h); // 发送速度数据高位
temp_sum = id + 5 + 0x03 + 0x20 + temp_value_l + temp_value_h;
temp_sum = ~temp_sum; // 计算校验和
SendUart0Byte(temp_sum); // 发送校验和
while ( !( UCSR0A & (1<{
; / 传输完成后,总线会被从机占用,反馈响应数据,所以进行了一段延时
}
int main(void)
{
InitUart0();
SetServoLimit(2, 0,1023);
while(1)
{
_delay_ms(1000); //延时1s
SetServoPosition(2, 1000, 500); //控制舵机以500的速度移动到1000
的位置 _delay_ms(1000); //延时1s
SetServoPosition(2, 200, 100); //控制舵机以100的速度移动到200的位置
}
}

使用Stm32控制舵机旋转到任意角度,32单片机需要学习哪些知识点?

舵机需要不同占空比的PWM脉冲,可以使用软延迟方法、定时器的基本功能或定时器的高级功能来生成。后两种方法需要定时器的知识
图中实验9是定时器产生PWM方波的高级功能

以上是小编对stm32串口控制舵机旋转角度(stm32控制舵机正反转)及相关问题的解答。 stm32串口控制舵机旋转角度(stm32控制舵机正反转)。希望对你有用!

0条大师的评论