项目技术要求
PWM波形的学习
参考文章stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)_ttl pwm 驱动激光头区别-CSDN博客
舵机的学习
参考文章
stm32 TIM输出比较(PWM驱动LED呼吸灯&&PWM驱动舵机&&PWM驱动直流电机)_ttl pwm 驱动激光头区别-CSDN博客
蓝牙的学习
参考文章
stm32 USART串口(串口发送&串口发送+接收)_stm32串口实现接收和发送-CSDN博客
项目材料
降压模块+2节14500 3.7v电池+芯片拓展版+HC-06蓝牙模块+stm32f103c8t6+8个舵机+3D打印机器人骨架
项目结构图
技术问题
PWM初始化
(1)是否可以同时开启多个TIM时钟
1.独立配置:你可以对多个定时器(如 TIM2、TIM3、TIM4 等)分别调用 TIM_InternalClockConfig()
函数,例如:
TIM_InternalClockConfig(TIM2);
TIM_InternalClockConfig(TIM3);
2.相互独立:每个定时器都是独立工作的,因此可以同时开启多个定时器的内部时钟配置。每个定时器的状态和配置不会互相干扰。
3.资源限制:需要注意的是,虽然可以同时开启多个定时器,但要确保你的 MCU 有足够的资源(如定时器数量、计数器和中断处理能力等)。
4.使用场景:在某些应用场景中,你可能会用到多个定时器来实现不同的功能,比如定时器1用于PWM输出,定时器2用于延时,定时器3用于事件计数等。
5.总结:可以同时开启多个定时器的内部时钟配置,只需确保每个定时器都被正确初始化和配置即可。
(2)TIM使能问题
使用定时器(TIM)时,确保其正确使能是非常重要的。确保正确配置和使能 TIM 是保证 STM32 定时器正常工作的关键。
(3)捕获通道的正确开启
由于本项目需要开启所有的捕获通道,要保证所有的通道的开启
输入捕获通道CCR的正确的写入
(4)四足机器人步态
代码书写
main.c
#include "stm32f10x.h" // Device header
#include "Delay.h"
#include "OLED.h"
#include "Servo.h"
#include "Serial.h"
uint8_t RxData;
uint8_t Middle;
float Angle;
const uint16_t RunAdvance[6][8]={
{110,150,100,40,130,40,50,50},{45,100,100,40,130,40,50,50},{130,150,160,40,110,40,70,50},
{60,150,140,40,70,40,100,50},{60,150,140,40,120,80,100,50},{80,150,170,40,80,0,50,50}};
const uint8_t StartStates[]={60,145,140,30,100,40,70,60};
const uint16_t HelloStates[2][8]={
{60,60,140,20,130,30,70,40},{60,130,140,20,130,30,70,40}};
const uint16_t HapplyStates[2][8]={
{60,90,140,80,100,80,70,10},{110,90,90,80,70,80,100,10}};
int main(void)
{
Servo_Init_Right();
Servo_Init_Left();
Serial_Init();
while (1)
{
if (Serial_GetRxFlag() == 1) //检查串口接收数据的标志位
{
RxData = Serial_GetRxData(); //获取串口接收的数据
Serial_SendByte(RxData);
if(RxData==0x34)
{
for(int i=0;i<6;i++)
{
Servo_SetAngle1_Left(RunAdvance[i][0]);
Servo_SetAngle2_Left(RunAdvance[i][1]);
Servo_SetAngle3_Left(RunAdvance[i][2]);
Servo_SetAngle4_Left(RunAdvance[i][3]);
Servo_SetAngle1_Right(RunAdvance[i][4]);
Servo_SetAngle2_Right(RunAdvance[i][5]);
Servo_SetAngle3_Right(RunAdvance[i][6]);
Servo_SetAngle4_Right(RunAdvance[i][7]);
Delay_ms(250);
}
}
if(RxData==0x35)
{
Servo_SetAngle1_Left(StartStates[0