16路舵机控制版(维特智能)

我之前偶然间买了维特智能的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 }
//单个舵机操作
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()来进行动作组操作便可以了;

如有需要,愿君自取。

你可能感兴趣的:(单片机,stm32,嵌入式硬件)