STM32F103C8T6驱动16路舵机
一、所需硬件:
01、STM32F103C8T6最小系统板。
02、ST-LINK V2下载器。
03、CH340。
04、16个SG90舵机。
05、杜邦线。
06、STM32F103C8T6舵机驱动板(有的话接线方便,没有亦可)。
二、所需软件:
01、MDK5。
02、串口调试助手XCOM。
三、配套代码:(已免费分享,在文章顶部即可下载)
01、四个按键触发16路舵机进行偏转:
/********************************************************************************************************************************************
2022.07.30 基础知识储备:
TIM1_ETR PA12
TIM1_CH1 PA8 TIM2_CH1_ETR PA0 TIM3_CH1 PA6 TIM4_CH1 PB6
TIM1_CH2 PA9 TIM2_CH2 PA1 TIM3_CH2 PA7 TIM4_CH2 PB7
TIM1_CH3 PA10 TIM2_CH3 PA2 TIM3_CH3 PB0 TIM4_CH3 PB8
TIM1_CH4 PA11 TIM2_CH4 PA3 TIM3_CH4 PB1 TIM4_CH4 PB9
SG90舵机控制方法:
--高电平时间为T1-- 总周期20ms:
—— —— —— ——
| | 高电平时间T1为 0.5ms 舵机转动0°
| | 高电平时间T1为 1ms 舵机转动45°
| | 高电平时间T1为 1.5ms 舵机转动90°
| | 高电平时间T1为 2ms 舵机转动135°
—— —— —— —— —— —— 高电平时间T1为 2.5ms 舵机转动180°
--------总周期 T2为20ms--------
代码思路:1、Ctrl + c 然后 Ctrl + v 哈哈哈哈!
以180度舵机为例定义:高电平时间T1为 1.5ms 舵机转动90° 相对位置为 0° 参数为1850
相对而言:高电平时间T1为 0.5ms 舵机转动0° 相对位置为 -90° 参数为1945
高电平时间T1为 1ms 舵机转动45° 相对位置为 -45° 参数为1900
高电平时间T1为 1.5ms 舵机转动90° 相对位置为 0° 参数为1850
高电平时间T1为 2ms 舵机转动135° 相对位置为 +45° 参数为1800
高电平时间T1为 2.5ms 舵机转动180° 相对位置为 +90° 参数为1750
//-90°
//TIM_SetCompare1(TIM4,1945);//占空比(2000-1945)/2000*20ms=0.5ms
//-45°
//TIM_SetCompare1(TIM4,1900);//占空比(2000-1900)/2000*20ms=1ms
//0°
//TIM_SetCompare1(TIM4,1850);//占空比(2000-1850)/2000*20ms=1.5ms
//+45°
//TIM_SetCompare1(TIM4,1800);//占空比(2000-1800)/2000*20ms=2ms
//+90°
//TIM_SetCompare1(TIM4,1750);//占空比(2000-1750)/2000*20ms=2.5ms
2022.07.31 1、机械狗项目需要用到的引脚有:
TIM1_CH1 PA8 TIM2_CH1_ETR PA0 TIM3_CH1 PA6 TIM4_CH1 PB6
TIM1_CH2 PA9 TIM2_CH2 PA1 TIM3_CH2 PA7 TIM4_CH2 PB7
TIM1_CH3 PA10 TIM2_CH3 PA2 TIM3_CH3 PB0 TIM4_CH3 PB8
TIM1_CH4 PA11 TIM2_CH4 PA3 TIM3_CH4 PB1 TIM4_CH4 PB9
2、测试按键IO为:
KEY0 PAin(4)
KEY1 PAin(5)
KEY2 PCin(15)
KEY3 PCin(14)
2023.12.03 20:40 继续推进 16路全部可以按键驱动,测试没有问题。
******************************************************************************************************************************************************/
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "pwm1.h"
#include "pwm2.h"
#include "pwm3.h"
#include "pwm4.h"
int main(void)
{
u8 t=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
TIM1_PWM_Init(1999,719); //PWM频率=72000000/(719+1)/(1999+1)=50hz=20ms
TIM2_PWM_Init(1999,719);
TIM3_PWM_Init(1999,719);
TIM4_PWM_Init(1999,719);
LED0=0; //点亮LED
while(1)
{
LED_Blink_1();
t=KEY_Scan(0); //得到键值
switch(t)
{
case KEY0_PRES: //PA4
TIM_SetCompare1(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH1 PA8
TIM_SetCompare1(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH2 PA9
TIM_SetCompare2(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH3 PA10
TIM_SetCompare3(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH4 PA11
TIM_SetCompare4(TIM1,1900);delay_ms(500);LED_Blink_1();
break;
case KEY1_PRES: //PA5
TIM_SetCompare1(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH1 PB6
TIM_SetCompare1(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH2 PB7
TIM_SetCompare2(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH3 PB8
TIM_SetCompare3(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH4 PB9
TIM_SetCompare4(TIM4,1900);delay_ms(500);LED_Blink_1();
break;
case KEY2_PRES: //PC15
TIM_SetCompare1(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH1 PA6
TIM_SetCompare1(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH2 PA7
TIM_SetCompare2(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH3 PB0
TIM_SetCompare3(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH4 PB1
TIM_SetCompare4(TIM3,1900);delay_ms(500);LED_Blink_1();
break;
case KEY3_PRES: //PC14
TIM_SetCompare1(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH1_ETR PA0
TIM_SetCompare1(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH2 PA1
TIM_SetCompare2(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH3 PA2
TIM_SetCompare3(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH4 PA3
TIM_SetCompare4(TIM2,1800);delay_ms(500);LED_Blink_1();
break;
default:delay_ms(10);
}
}
}
02、串口3接收到数据触发16路舵机偏转:
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "pwm1.h"
#include "pwm2.h"
#include "pwm3.h"
#include "pwm4.h"
#include "usart3.h"
int main(void)
{
u8 t=0;
delay_init(); //延时函数初始化
LED_Init(); //初始化与LED连接的硬件接口
KEY_Init(); //初始化与按键连接的硬件接口
TIM1_PWM_Init(1999,719); //PWM频率=72000000/(719+1)/(1999+1)=50hz=20ms
TIM2_PWM_Init(1999,719);
TIM3_PWM_Init(1999,719);
TIM4_PWM_Init(1999,719);
usart3_Init(9600);
LED0=0; //点亮LED
while(1)
{
if(USART3_RX_STA==1) // 串口1:PA9-TX PA10-RX 串口2:PA2-TX PA3-RX 串口3:PB10-TX PB11-RX
{
switch(USART3_RX_CMD)
{
//用01文件夹来存储需要应答的语句 //7E FF 06 0F 00 01 01 EF 播放01文件夹01首
case 0x01: Uart3_SendCMD2(0X01,0X01,0X01,0X01);LED_Blink_1();
TIM_SetCompare1(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH1 PA8
TIM_SetCompare1(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH2 PA9
TIM_SetCompare2(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH3 PA10
TIM_SetCompare3(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH4 PA11
TIM_SetCompare4(TIM1,1900);delay_ms(500);LED_Blink_1();
Uart3_SendCMD2(0X01,0X01,0X01,0X01);break;
case 0x02: Uart3_SendCMD2(0X02,0,0X02,0X02);LED_Blink_1();
TIM_SetCompare1(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH1_ETR PA0
TIM_SetCompare1(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH2 PA1
TIM_SetCompare2(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH3 PA2
TIM_SetCompare3(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH4 PA3
TIM_SetCompare4(TIM2,1800);delay_ms(500);LED_Blink_1();
Uart3_SendCMD2(0X02,0,0X02,0X02);break;
case 0x03: Uart3_SendCMD2(0X03,0X03,0X03,0X03);LED_Blink_1();
TIM_SetCompare1(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH1 PA6
TIM_SetCompare1(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH2 PA7
TIM_SetCompare2(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH3 PB0
TIM_SetCompare3(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH4 PB1
TIM_SetCompare4(TIM3,1900);delay_ms(500);LED_Blink_1();
Uart3_SendCMD2(0X03,0X03,0X03,0X03);break;
case 0x04: Uart3_SendCMD2(0X04,0X04,0X04,0X04);LED_Blink_1();
TIM_SetCompare1(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH1 PB6
TIM_SetCompare1(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH2 PB7
TIM_SetCompare2(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH3 PB8
TIM_SetCompare3(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH4 PB9
TIM_SetCompare4(TIM4,1900);delay_ms(500);LED_Blink_1();
Uart3_SendCMD2(0X04,0X04,0X04,0X04);break;
case 0x05: Uart3_SendCMD2(0X05,0X05,0X05,0X05);LED_Blink_1();
TIM_SetCompare1(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH1 PA8
TIM_SetCompare1(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH2 PA9
TIM_SetCompare2(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH3 PA10
TIM_SetCompare3(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM1,1800);delay_ms(500);LED_Blink_1(); //TIM1_CH4 PA11
TIM_SetCompare4(TIM1,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare1(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH1_ETR PA0
TIM_SetCompare1(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH2 PA1
TIM_SetCompare2(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH3 PA2
TIM_SetCompare3(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM2,1900);delay_ms(500);LED_Blink_1(); //TIM2_CH4 PA3
TIM_SetCompare4(TIM2,1800);delay_ms(500);LED_Blink_1();
TIM_SetCompare1(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH1 PA6
TIM_SetCompare1(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH2 PA7
TIM_SetCompare2(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH3 PB0
TIM_SetCompare3(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM3,1800);delay_ms(500);LED_Blink_1(); //TIM3_CH4 PB1
TIM_SetCompare4(TIM3,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare1(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH1 PB6
TIM_SetCompare1(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare2(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH2 PB7
TIM_SetCompare2(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare3(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH3 PB8
TIM_SetCompare3(TIM4,1900);delay_ms(500);LED_Blink_1();
TIM_SetCompare4(TIM4,1800);delay_ms(500);LED_Blink_1(); //TIM4_CH4 PB9
TIM_SetCompare4(TIM4,1900);delay_ms(500);LED_Blink_1();
Uart3_SendCMD2(0X05,0X05,0X05,0X05);break;
default:Uart3_SendCMD2(0XFF,0XFF,0XFF,0XFF);
}
USART3_RX_STA=0; //注意改写此条
}
}
}
四、配套代码下载链接:
01、文章对应的资源绑定可以下载。
02、仓库也可以下载:https://gitee.com/ha-city/12345678910.git
五、完结撒花:
01、良心分享:项目已经过UP实际测试:验证通过。
02、免费分享:不需要乱七八糟这的那的才能下载。
03、期待对你有所帮助。