STM32通过485通信控制舵机(提升版)

发布时间:2024年01月03日

1.简介:

? ? ? ? 本章节作为上一章节的续版,增添了设置ID,单独发送ID控制舵机的代码,以及设置波特率的舵机驱动代码(并不是所有舵机都支持修改波特率),代码仅供参考,真实使用需要配合自己舵机的数据手册和编程手册进行编写驱动程序。

上一节速达:

STM32通过485通信控制舵机(简易版)icon-default.png?t=N7T8https://blog.csdn.net/m0_66301378/article/details/134634446?spm=1001.2014.3001.5501

2.驱动函数:

2.1设置ID函数:

void send_set_id(uint8_t id)
{
	uint8_t i = 0;
	uint8_t Data_buffer[15];
	Data_buffer[0] = 0xFF;	//头地址
	Data_buffer[1] = 0xFF;	//头地址
	Data_buffer[2] = 0xFE;	//广播
	
	Data_buffer[3] = 0x04;	//长度
	Data_buffer[4] = 0x03;	//WRITE DATA
	Data_buffer[5] = 0X05;	//舵机ID
	Data_buffer[6] = id;
	Data_buffer[7]= (~(Data_buffer[2] + Data_buffer[3] + Data_buffer[4] + Data_buffer[5] + Data_buffer[6])) & 0xFF;
	
	for(i = 0;i <= 7;i ++)
	{
		printf("%c",Data_buffer[i]);//一个一个发送出
	}
}

2.2修改波特率函数:

void send_Baud_Rate(uint8_t Baud_Rate)  //5=115200  9=1000000
{
	uint8_t i = 0;
	uint8_t Data_buffer[10];
	
	Data_buffer[0]=0xFF;	//头地址
	Data_buffer[1]=0xFF;	//头地址
	Data_buffer[2]=0xFE;	  //广播
	                      
	Data_buffer[3]=0x04;	//长度
	Data_buffer[4]=0x03;	//WRITE DATA
	
	Data_buffer[5]=0x1E;	//角度存储地址
	
	Data_buffer[6]=Baud_Rate;
	
	Data_buffer[7]= (~(Data_buffer[2] + Data_buffer[3] + Data_buffer[4] + Data_buffer[5] + Data_buffer[6])) & 0xFF;
	
	for(i = 0;i <= 7;i ++)
	{
		printf("%c",Data_buffer[i]);//一个一个发送出
	}
}

2.3发送修改舵机角度函数:

void send_position(uint8_t id,unsigned short Control_Angle)  //有效范围:0~4095
{
	uint8_t j = 0;
	uint8_t Data_buffer[15];
	
	Data_buffer[0]=0xFF;	//头地址
	Data_buffer[1]=0xFF;	//头地址
	Data_buffer[2]=id;	  //广播
	                      
	Data_buffer[3]=0x05;	//长度
	Data_buffer[4]=0x04;	//Reg Write
	Data_buffer[5]=0X2A;	//角度存储地址
	
	//因为unsigned short是16位,uint8_t是8位,需要取出上8位和下8位
	Data_buffer[6]=Control_Angle >> 8;//上8位
	Data_buffer[7]=(Control_Angle << 8) >> 8;//下8位
	
	//校验位是除开头地址之外,其他地址和
	Data_buffer[8]= (~(Data_buffer[2] + Data_buffer[3] + Data_buffer[4] + Data_buffer[5] + Data_buffer[6] + Data_buffer[7])) & 0xFF;
	
	for(j = 0;j <= 8;j ++)
	{
		printf("%c",Data_buffer[j]);//一个一个发送出
	}
}

2.4发送修改舵机角度函数(配合运行时间一起控制):


void send_position_time(uint8_t id,unsigned short Control_Angle,unsigned short Time)  //有效范围:0~4095
{
	uint8_t j = 0;
	uint8_t Data_buffer[15];
	
	Data_buffer[0]=0xFF;	//头地址
	Data_buffer[1]=0xFF;	//头地址
	Data_buffer[2]=id;	  //0xFE广播
	                      
	Data_buffer[3]=0x07;	//长度
	Data_buffer[4]=0x04;	//Reg Write
	Data_buffer[5]=0X2A;	//角度存储地址
	
	//因为unsigned short是16位,uint8_t是8位,需要取出上8位和下8位
	Data_buffer[6]=Control_Angle >> 8;//上8位
	Data_buffer[7]=(Control_Angle << 8) >> 8;//下8位
	
	Data_buffer[8]=Time >> 8;//上8位
	Data_buffer[9]=(Time << 8) >> 8;//下8位
	
	//校验位是除开头地址之外,其他地址和
	Data_buffer[10]= (~(Data_buffer[2] + Data_buffer[3] + Data_buffer[4] + Data_buffer[5] + Data_buffer[6] + Data_buffer[7] + Data_buffer[8] + Data_buffer[9])) & 0xFF;
	
	for(j = 0;j <= 10;j ++)
	{
		printf("%c",Data_buffer[j]);//一个一个发送出
	}
}

3.驱动函数:

? ? ? ? 开源是为了相互提升,相互帮助,如果对代码有疑问可在评论区进行探讨,希望大家可以一起加油成长!

文章来源:https://blog.csdn.net/m0_66301378/article/details/135352689
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。