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

news/2024/11/23 0:30:48/

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

如有需要,愿君自取。


http://www.ppmy.cn/news/147512.html

相关文章

展讯驱动入门

展讯驱动入门 fastboot download cmd: fastboot flash uboot u-boot.bin fastboot flash boot boot.img LCM 基础知识&#xff1a;http://blog.chinaunix.net/uid-28454895-id-4216124.html code path: kernel/drivers/video/sprdfb/lcd kernel/drivers/video/backlight …

【C#图解教程】第六章 方法(下)

输出参数 函数的输出只有返回值有时不太够&#xff0c;此时需要用到输出参数&#xff0c;用修饰词out声明 输出参数的要求与引用参数类似&#xff0c;需要是变量&#xff0c;此外&#xff0c;输出参数也是实参的别名&#xff0c;指向堆中同一对象。 输出参数与引用参数的不同在…

拯救Linux小白:学习这20条命令,玩转Linux

目录 cdpwdlscpmvrmmkdircatlessheadtailgrepmanchownchmodtopfinddfdups !! Conclusion 在处理 Linux 时&#xff0c;您需要使用一个 shell——一个可以让您访问操作系统的接口。命令需要作为输入来通知或指导计算机程序执行特定操作。虽然大多数Linux 发行版都是用户友好的&a…

kaggle新赛:蛋白质功能预测大赛baseline

日前&#xff0c;Kaggle发布了CAFA 5 Protein Function Prediction蛋白质功能预测大赛。这是一个机器学习中的序列预测任务&#xff0c;需要你开发一个基于蛋白质氨基酸序列和其他数据的模型&#xff0c;预测一组蛋白质的功能。 该竞赛评估参与者对蛋白质序列的基因本体论&…

3D元宇宙数字展厅—虚拟智能化办公展厅引领未来办公新风尚

随着数字化技术和虚拟现实的迅猛发展&#xff0c;传统的办公方式正在经历一场革命性的变革。在这个数字化时代&#xff0c;虚拟智能化办公展厅正以其独特的优势和创新的展示方式&#xff0c;引领着未来办公的新风尚。 让我们一同探索虚拟智能化办公展厅的魅力&#xff0c;以及它…

CH9102与CP2102应用注意事项

文章目录 概述应用差异说明驱动说明GPIO使用说明硬件差异说明CH9102F VS CP2102N-GQFN24CH9102X VS CP2102CH9102X VS CP2102N-GQFN28 其他说明 CH9102资料链接 概述 CH9102&#xff08;WCH&#xff09;与CP2102的不同子型号之间可实现pintopin兼容&#xff0c;可以在不更改硬…

CH9102:国产USB转高速串口RS232芯片兼容替代CP2102

目录 CH9102简介CH9102芯片特性 差异说明1. 应用差异2. 硬件差异3. 其他说明 CH9102简介 CH9102是一个USB总线的转接芯片&#xff0c;实现USB转高速异步串口。提供了常用的MODEM联络信号&#xff0c;用于为计算机扩展异步串口&#xff0c;或者将普通的串口设备或者MCU直接升级…

codevs 2102

codevs 2102 典型的石子归并&#xff0c;但此题与原题不同的是&#xff1a;这是一个圆圈&#xff0c;所以我们断环为链&#xff0c;但从哪里断了&#xff0c;最后决定随便断&#xff0c;本题是从1断&#xff0c;再将链延长为2倍 #include <iostream> #include <cstd…