小伙伴买了这个电机后,发现CSDN还没有人写有相关驱动,所以打算分享一下。
本文只做工程分享,不想多讲其它的,谅解。
参考自官方文档:https://www.waveshare.net/wiki/DDSM115#.E4.BA.A7.E5.93.81.E7.89.B9.E6.80.A7
.c头文件
#include "DDSM115.h" uint8_t DDSM115_ID[8] = { 0x01,0x00, }; /** * @brief CRC8校验码 * @param void * @retval void */ uint8_t Crc8_MAXIM(uint8_t *data, uint8_t len) { uint8_t crc, i; crc = 0x00; while(len--) { crc ^= *data++; for(i = 0;i < 8;i++) { if(crc & 0x01) { crc = (crc >> 1) ^ 0x8c; } else crc >>= 1; } } return crc; } /** * @brief 电机模式设定 * @param id:默认0x01 mode: 0x01 电流环 0x02 速度环 0x03 位置环(切换为位置环时电机转速需低于10rpm) * @retval void */ void DDSM_Mode_Set(uint8_t id,uint8_t mode) { uint8_t data[10]; data[0]=id; data[1]=0xA0; data[2]=0x00; data[3]=0x00; data[4]=0x00; data[5]=0x00; data[6]=0x00; data[7]=0x00; data[8]=0x00; data[9]=mode; HAL_UART_Transmit( &huart1,data,sizeof(data),0xff ); } /** * @brief 电机ID设置 * @param 连续发五次该指令 * @retval void */ void DDSM_ID_Set(uint8_t id) { uint8_t data[10]; data[0]=0xAA; data[1]=0x55; data[2]=0x53; data[3]=id; data[4]=0x00; data[5]=0x00; data[6]=0x00; data[7]=0x00; data[8]=0x00; data[9]=0x00; HAL_UART_Transmit( &huart1,data,sizeof(data),0xff ); } /** * @brief 驱动电机转动 * @param ctrl_value:在当面模式下的控制值 speedUp_Time:加速时间 lock_Car:刹车 0xff生效 速度环模式下使用 * @retval void */ uint8_t b,d,f; void DDSM_Motor_Star(uint8_t id,int16_t ctrl_value,uint8_t speedUp_Time,uint8_t lock_Car) { uint8_t data[10]; data[0]=0x01; data[1]=0x64; data[2]=(uint8_t)(ctrl_value>>8); //高八位 d = data[2]; data[3]=(uint8_t)(ctrl_value); //低八位 f = data[3]; data[4]=0x00; data[5]=0x00; data[6]=0x00; //加速时间 加速模式下使用 data[7]=0x00; data[8]=0x00; data[9]=Crc8_MAXIM(data, 9); b = data[9]; HAL_UART_Transmit( &huart1,data,sizeof(data),0xff ); } /** * @brief 电机反馈 * @param void * @retval void */ void DDSM_FeedBack(uint8_t id) { uint8_t data[10]; data[0]=id; data[1]=0x74; data[2]=0x00; data[3]=0x00; data[4]=0x00; data[5]=0x00; data[6]=0x00; data[7]=0x00; data[8]=0x00; data[9]=Crc8_MAXIM(data, 9);; HAL_UART_Transmit( &huart1,data,sizeof(data),0xff ); } /** *@brief 电机初始化 * @param void * @retval void */ void DDSM_Motor_Init(uint8_t id,uint8_t mode) { DDSM_Mode_Set(id,mode); //设定电机模式 }
.h文件
#ifndef __DDSM115_H #define __DDSM115_H #include "usart.h" #define DDSM_UART_IT &huart1 #define AngleToMotor(angle) (uint16_t)(angle*91.01944444444444) //角度 0°~360° #define SpeedToMotor(speed) (int16_t) (speed) //速度 -330~330 rpm #define CurrentToMotor(cur) (int16_t) (cur*4095.875) //电流 -8~8A #define Motor_Current 0x01 //电流环 #define Motor_Speed 0x02 //速度环 #define Motor_Position 0x03 //位置环 extern uint8_t DDSM115_ID[8]; void DDSM_Motor_Star(uint8_t id,int16_t ctrl_value,uint8_t speedUp_Time,uint8_t lock_Car); void DDSM_Motor_Init(uint8_t id,uint8_t mode); void DDSM_FeedBack(uint8_t id); void DDSM_ID_Set(uint8_t id); #endif /* __DDSM115_H */