我之前偶然间买了维特智能的16路舵机控制版,发现网上相关资料比较少,于是只能自己看说明书,自己不断探索,于是乎想把自己总结的一点知识传递出来,供大家一起学习。

硬件连接:

双路供电
1.USB 口/串口是给舵机控制板供电的, 电压 3.3V, 也是用来和上位机通讯的接口。
2.JP1 口是给舵机供电的, 电压 5-7.2V, 电流不能过小 在 1A 以上。
注: 上位机上编程时可以直接 USB 口/串口, 如果有连接舵机, 必须要用 JP1 口给舵机
供电, 不然舵机无法转动。 有双路供电情况下, 上位机操作也正确情况下, 还是不能控制
舵机的话, 请测量下 JP1 口电压是否正常, 这种现象一般是电源不稳定引起的。
 USB 连接
仅需要一条手机 USB 数据线, 连接电脑和控制板, 即可连接上位机, 测试控制板的基
本功能
软件连接
( 1) 双击上位机图标 , 打开上位机。
( 2) 点击文件, 选择 16 路舵机控制板。
当上位机界面底部的显示为绿色, 即为在线状态, 此时控制板指示灯( DS1) 缓慢
闪烁
 

我是用正点原子的STM32F407ZGT6探索者开发板来操控的,编写了一个wt.c作为模块化管理;话不多说,上代码。

#include "sys.h"
 #include "wt.h"
 #include "DMREG.h"
 #include "delay.h"#define GET_LOW_BYTE(A)     ((uint8_t)(A))
 #define GET_HIGH_BYTE(A)     ((uint8_t)((A)>>8))
 uint8_t Data[128]={0};static unsigned char TxBuffer[256];
 static unsigned char TxCounter=0;
 static unsigned char count=0; 
 extern void CopeSerial1Data(unsigned char ucData);void UART2_Init(u32 bound)
 {
      GPIO_InitTypeDef GPIO_InitStructure;
     USART_InitTypeDef USART_InitStructure;
     NVIC_InitTypeDef NVIC_InitStructure;
     
     RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOD,ENABLE); 
     RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART2,ENABLE);
  
     GPIO_PinAFConfig(GPIOD,GPIO_PinSource5,GPIO_AF_USART2); 
     GPIO_PinAFConfig(GPIOD,GPIO_PinSource6,GPIO_AF_USART2); 
     
     //USART2端口配置
   GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5 | GPIO_Pin_6; 
     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;//复用功能
     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;    //速度50MHz
     GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
     GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
     GPIO_Init(GPIOD,&GPIO_InitStructure);    //USART2 初始化设置
   USART_InitStructure.USART_BaudRate = bound;//波特率设置
   USART_InitStructure.USART_WordLength = USART_WordLength_8b;//字长为8位数据格式
   USART_InitStructure.USART_StopBits = USART_StopBits_1;//一个停止位
   USART_InitStructure.USART_Parity = USART_Parity_No;//无奇偶校验位
   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
   USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
   USART_Init(USART2, &USART_InitStructure); //初始化串口2  NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQn;//串口2中断通道
   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//抢占优先级3 数值越小优先级越高
   NVIC_InitStructure.NVIC_IRQChannelSubPriority =2; //子优先级3,响应优先级
   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
   NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器、  USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);//开启接收中断
   USART_Cmd(USART2, ENABLE);  //使能串口2}
 void UART2_Put_Char(unsigned char DataToSend)
 {
     TxBuffer[count++] = DataToSend;  
   USART_ITConfig(USART2, USART_IT_TXE, ENABLE);  
 }void UART2_Put_String(unsigned char *Str)
 {
     while(*Str)
     {
         if(*Str=='\r')UART2_Put_Char(0x0d);
             else if(*Str=='\n')UART2_Put_Char(0x0a);
                 else UART2_Put_Char(*Str);
         Str++;
     }
 }void CopeSerial1Data(unsigned char ucData)
 {
 }void USART2_IRQHandler(void)
 {
   
     if(USART_GetITStatus(USART2, USART_IT_TXE) != RESET)
   {   
     USART_SendData(USART2, TxBuffer[TxCounter++]); 
     if(TxCounter == count) 
         {
             USART_ITConfig(USART2, USART_IT_TXE, DISABLE);// 全部发送完成
         }
     USART_ClearITPendingBit(USART2, USART_IT_TXE); 
   }
     else if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
   {
         CopeSerial1Data((unsigned char)USART2->DR);//处理数据
         USART_ClearITPendingBit(USART2, USART_IT_RXNE);
   }
     USART_ClearITPendingBit(USART2,USART_IT_ORE);}
 void UART2_Put_StringL(unsigned char *Str,unsigned char len)
 {
     unsigned char i = 0;
     for (i=0;i<len;i++) UART2_Put_Char(*(Str + i));
 }
 //单个舵机操作
 void one_servo_control(u8 servoID,u16 time,u16 degree)//舵机ID,快慢,角度(取1000-2500对应0-180°)
 {
     Data[0]=Data[5]=0xff;
     Data[1]=0x01;Data[6]=0x02;
     Data[2]=Data[7]=servoID;
     Data[3]=GET_LOW_BYTE(time);
     Data[4]=GET_HIGH_BYTE(time);
     Data[8]=GET_LOW_BYTE(degree);
     Data[9]=GET_HIGH_BYTE(degree);
     UART2_Put_StringL(Data,10);  
 }
 //动作组操作
 void servo_group(u8 GroupID)//动作组ID,需提前在上位机中设置好动作组
 {
     Data[0]=0xff;
     Data[1]=0x09;
     Data[2]=0x00;
     Data[3]=GET_LOW_BYTE(GroupID);
     Data[4]=GET_HIGH_BYTE(GroupID);
     UART2_Put_StringL(Data,5); 
 }void UART_DM_ReportData(unsigned char data[])
 {        
     UART2_Put_StringL(data,10);     //打印长度根据所打印的数组长度来改,动作组是5,速度状态是10。最好填10。        
 } void stop_action(void)//停止动作
 {
     UART_DM_ReportData(stop);
 }void next (void)//继续动作组
 {
     UART_DM_ReportData(continu);
 }


 

wt.h文件如下:

#ifndef __USART2_H
 #define __USART2_H
 #include "sys.h" 
 void UART2_Init(u32 bound);
 void UART2_Put_Char(unsigned char DataToSend);
 void UART2_Put_String(unsigned char *Str);
 void CopeSerial1Data(unsigned char ucData);void USART2_IRQHandler(void);
 void UART2_Put_StringL(unsigned char *Str,unsigned char len);
 void UART_DM_ReportData(unsigned char data[]);void one_servo_control(u8 servoID,u16 time,u16 degree);
 void stop_action(void);
 void next (void);#endif

接下来只要在其他文件中调用:

one_servo_control()来进行单个多级操作;

servo_group()来进行动作组操作便可以了;

如有需要,愿君自取。