由于tb6612缺货,价太猛。后面需要改造一下电路。用双PWM进行控制一个电机。
PWM口分配
P1–定时器1的两个通道CH1-E9 --CH2-E11
P2–定时器1的两个通道CH3-E13 -CH4-E14
P3–定时器9的两个通道CH1 E5 --CH2-E6
P4 定时器12的两个通道CH1(PB14)CH2-PB15
舵机
定时器8
(舵机1)CH1-C6
(舵机2)CH2-C7
(舵机3)CH3-C8
CH4-C9(注意,
这里分配给了MPU6050的中断)
(舵机4)定时器10–PB8
(舵机5)定时器11–PB9
(舵机6)定时器13–PA6
(舵机7)定时器14–PA7
定时器2、定时器3、定时器4、定时5都用作了编码器
定时器6作为心跳
定时器7作为另外一个心跳。
这么一来,可以适配多数的驱动器。后续自己也会制做一个小尺寸的驱动器。更新一下实验室的学习板子。
更新的电机函数是
dcmotor2.h
/*
明确目的:控制四路直流电机
利用双PWM进行控制一个电机。
P1--定时器1的两个通道CH1-E9 --CH2-E11
P2--定时器1的两个通道CH3-E13 -CH4-E14
P3--定时器9的两个通道CH1 E5 --CH2-E6
P4 定时器12的两个通道CH1(PB14)CH2-PB15
舵机
定时器8
(舵机1)CH1-C6
(舵机2)CH2-C7
(舵机3)CH3-C8
CH4-C9(注意,这里分配给了MPU6050的中断)
(舵机4)定时器10--PB8
(舵机5)定时器11--PB9
(舵机6)定时器13--PA6
(舵机7)定时器14--PA7
定时器2、定时器3、定时器4、定时5都用作了编码器
定时器6作为心跳
定时器7作为另外一个心跳。
*/
#ifndef __DCMOTOR2_H
#define __DCMOTOR2_H
#include "sys.h"
//直流电机端口定义
//是定时器器1的设置,用定时器1产生PWM,控制直流电机
//设置的说明:设置定时器的计时滴答是1us,由于是控制直流电机,所以可以设置PWM频率是10K左右;
//PWM2模式(注意,如果是PWM1模式,是从1电平翻转到0电平,如果PMW2,就是0电平翻转到1电平)
//经过测试,是调到PWM2模式,不然就是相反状态,用逻辑分析仪进行观察波形
//按照原理图,利用的是GPIO引脚
//PE9--T1CH1---P3接线端口---D2/D3
//PE11-T1CH2---P4接线端口---D0/D1
//PE13-T1CH3---P1接线端口---D11/D10
//PE14-T1CH4---P2接线端口---B14/B15
//e13 pwm-tim1-ch3-----------接口端子的P1口,M-5V-B7-B6-GND-M--tim4
//d11
//d10...正交编码使用定时器4
//P1--定时器1的两个通道CH1-E9 --CH2-E11
//*******************************************以下是定时器1的配置*************************************
//*****************
//是定时器器1的设置,用定时器1产生PWM,控制直流电机
//设置的说明:设置定时器的计时滴答是1us,由于是控制直流电机,所以可以设置PWM频率是10K左右;
//PWM2模式(注意,如果是PWM1模式,是从1电平翻转到0电平,如果PMW2,就是0电平翻转到1电平)
//经过测试,是调到PWM2模式,不然就是相反状态,用逻辑分析仪进行观察波形
//按照原理图,利用的是GPIO引脚
//PE9--T1CH1---P3接线端口---D2/D3
//PE11-T1CH2---P4接线端口---D0/D1
//PE13-T1CH3---P1接线端口---D11/D10
//PE14-T1CH4---P2接线端口---B14/B15
#define HTimer1Clk RCC_APB2Periph_TIM1
#define HTimer1CH1Port GPIOE
#define HTimer1CH1Pin GPIO_Pin_9
#define HTimer1CH1PinSource GPIO_PinSource9
#define HTimer1CH1GPIOClk RCC_AHB1Periph_GPIOE
#define HTimer1CH2Port GPIOE
#define HTimer1CH2Pin GPIO_Pin_11
#define HTimer1CH2PinSource GPIO_PinSource11
#define HTimer1CH2GPIOClk RCC_AHB1Periph_GPIOE
#define HTimer1CH3Port GPIOE
#define HTimer1CH3Pin GPIO_Pin_13
#define HTimer1CH3PinSource GPIO_PinSource13
#define HTimer1CH3GPIOClk RCC_AHB1Periph_GPIOE
#define HTimer1CH4Port GPIOE
#define HTimer1CH4Pin GPIO_Pin_14
#define HTimer1CH4PinSource GPIO_PinSource14
#define HTimer1CH4GPIOClk RCC_AHB1Periph_GPIOE
#define HTim1AddTimeTick 1
//这里是微s单位,1,因为高级定时器8是168Mhz总线,采用168分频,就是1Mhz,1微妙频率,
#define HTim1_Prescaler (168-1) //预分频系数168*HTim1AddTimeTick - 1
void HTim1_Init(u32 arr,u32 psc);//168主频
void TIM9_PWM_Init(u32 arr,u32 psc);//168主频
void TIM12_PWM_Init(u32 arr,u32 psc);//84主频
void Motor1Pwm(int DutyTemp);
void Motor2Pwm(int DutyTemp);
void Motor3Pwm(int DutyTemp);
void Motor4Pwm(int DutyTemp);
#endif
demotor2.c
#include "dcmotor2.h"
void HTim1_Init(u32 arr,u32 psc)
{
/* 定义一个 GPIO_InitTypeDef 类型的结构体 */
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
/* 开启定时器相关的 GPIO 外设时钟 */
RCC_AHB1PeriphClockCmd(HTimer1CH1GPIOClk, ENABLE);//
RCC_AHB1PeriphClockCmd(HTimer1CH2GPIOClk, ENABLE);//
RCC_AHB1PeriphClockCmd(HTimer1CH3GPIOClk, ENABLE);//
RCC_AHB1PeriphClockCmd(HTimer1CH4GPIOClk, ENABLE);//
GPIO_PinAFConfig(HTimer1CH1Port,HTimer1CH1PinSource,GPIO_AF_TIM1);
GPIO_PinAFConfig(HTimer1CH2Port,HTimer1CH2PinSource,GPIO_AF_TIM1);
GPIO_PinAFConfig(HTimer1CH3Port,HTimer1CH3PinSource,GPIO_AF_TIM1);
GPIO_PinAFConfig(HTimer1CH4Port,HTimer1CH4PinSource,GPIO_AF_TIM1);
/* 定时器功能引脚初始化 */
GPIO_InitStructure.GPIO_Pin = HTimer1CH1Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(HTimer1CH1Port, &GPIO_InitStructure);
/* 定时器功能引脚初始化 */
GPIO_InitStructure.GPIO_Pin = HTimer1CH2Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(HTimer1CH2Port, &GPIO_InitStructure);
/* 定时器功能引脚初始化 */
GPIO_InitStructure.GPIO_Pin = HTimer1CH3Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(HTimer1CH3Port, &GPIO_InitStructure);
/* 定时器功能引脚初始化 */
GPIO_InitStructure.GPIO_Pin = HTimer1CH4Pin;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz;
GPIO_Init(HTimer1CH4Port, &GPIO_InitStructure);
// 开启 TIMx_CLK
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
/* 累计 TIM_Period 个后产生一个更新或者中断 */
//10khz =0.1ms=100us
TIM_TimeBaseStructure.TIM_Period = arr;
//定时器时钟源 TIMxCLK =168MHz
// 设定定时器频率为 =TIMxCLK/(TIM_Prescaler+1)=168/(168-1+1)=1MHz
TIM_TimeBaseStructure.TIM_Prescaler = psc;//1us加一次
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM_TimeBaseStructure.TIM_RepetitionCounter=0;
// 初始化定时器 TIMx
TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);
/* ================== 输出结构体初始化 =================== */
// 配置为 PWM 模式 1,先输出高电平,达到比较值的时候再改变电平
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
// 主输出使能
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
// 互补输出使能
TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable;
// 配置比较值
TIM_OCInitStructure.TIM_Pulse = 500;
// 主输出高电平有效
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;
// 互补输出高电平有效
TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;
// 主输出在被禁止时为高电平
TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
// 互补输出在被禁止时为低电平
TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
// 通道初始化
TIM_OC1Init(TIM1, &TIM_OCInitStructure);
// 使能通道重装载
TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable);
//定时1第二通道的设置和第一通道CH1一样;
TIM_OC2Init(TIM1, &TIM_OCInitStructure);
// 使能通道重装载
TIM_OC2PreloadConfig(TIM1, TIM_OCPreload_Enable);
TIM_OC3Init(TIM1, &TIM_OCInitStructure);
// 使能通道重装载
TIM_OC3PreloadConfig(TIM1, TIM_OCPreload_Enable);
//定时8第二通道的设置和第一通道CH1一样;
TIM_OC4Init(TIM1, &TIM_OCInitStructure);
// 使能通道重装载
TIM_OC4PreloadConfig(TIM1, TIM_OCPreload_Enable);
// /* ================ 断路和死区结构体初始化 ================ */
// // 自动输出使能,断路、死区时间和锁定配置
// TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable;
// TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;
// TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;
// // 配置死区时间
// TIM_BDTRInitStructure.TIM_DeadTime = 11;
// TIM_BDTRInitStructure.TIM_Break = TIM_Break_Enable;
// // 配置刹车引脚电平,当引脚为配置的电平时,主和互补输出都被禁止
// TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_Low;
// TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
// TIM_BDTRConfig(ADVANCE_TIM, &TIM_BDTRInitStructure);
// 能定时器
// 主动输出使能
TIM_CtrlPWMOutputs(TIM1, ENABLE);
TIM_Cmd(TIM1, DISABLE);
}
//TIM9 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
void TIM9_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//注意,定时器9用APB2时钟线168M
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM9,ENABLE); //TIM9时钟使能
//在那个引脚产生PWM?设定对应PWM口的时钟打开,这里用E5,E6
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOE, ENABLE); //使能PORTF时钟
//引脚复用
GPIO_PinAFConfig(GPIOE,GPIO_PinSource5,GPIO_AF_TIM9); //GPIOE5复用为定时器14
GPIO_PinAFConfig(GPIOE,GPIO_PinSource6,GPIO_AF_TIM9);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5|GPIO_Pin_6; //GPIOE5 E6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOE,&GPIO_InitStructure); //初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM9,&TIM_TimeBaseStructure);//初始化定时器14
//初始化TIM9 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM9, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OCInitStructure.TIM_Pulse = 2; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效
TIM_OC1Init(TIM9, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
TIM_OC1PreloadConfig(TIM9, TIM_OCPreload_Enable); //CH1 预装载使能
TIM_OCInitStructure.TIM_Pulse = 2; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效
TIM_OC2Init(TIM9, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
TIM_OC2PreloadConfig(TIM9, TIM_OCPreload_Enable); //CH1 预装载使能
TIM_ARRPreloadConfig(TIM9,ENABLE);//ARPE使能
TIM_Cmd(TIM9, DISABLE); //使能TIM14
}
//TIM12 PWM部分初始化
//PWM输出初始化
//arr:自动重装值
//psc:时钟预分频数
//B14--B15
void TIM12_PWM_Init(u32 arr,u32 psc)
{
//此部分需手动修改IO口设置
GPIO_InitTypeDef GPIO_InitStructure;
TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;
TIM_OCInitTypeDef TIM_OCInitStructure;
//注意,定时器12用APB1时钟线
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM12,ENABLE); //TIM9时钟使能
//在那个引脚产生PWM?设定对应PWM口的时钟打开,这里用B14--B15
RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOB, ENABLE); //使能PORTF时钟
//引脚复用
GPIO_PinAFConfig(GPIOB,GPIO_PinSource14,GPIO_AF_TIM12);
GPIO_PinAFConfig(GPIOB,GPIO_PinSource15,GPIO_AF_TIM12);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_14|GPIO_Pin_15; //GPIOE5 E6
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF; //复用功能
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_100MHz; //速度100MHz
GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; //推挽复用输出
GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; //上拉
GPIO_Init(GPIOB,&GPIO_InitStructure); //初始化PF9
TIM_TimeBaseStructure.TIM_Prescaler=psc; //定时器分频
TIM_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
TIM_TimeBaseStructure.TIM_Period=arr; //自动重装载值
TIM_TimeBaseStructure.TIM_ClockDivision=TIM_CKD_DIV1;
TIM_TimeBaseInit(TIM12,&TIM_TimeBaseStructure);//初始化定时器14
//初始化TIM9 Channel1 PWM模式
TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; //输出极性:TIM输出比较极性低
TIM_OC1Init(TIM12, &TIM_OCInitStructure); //根据T指定的参数初始化外设TIM1 4OC1
TIM_OCInitStructure.TIM_Pulse = 2; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效
TIM_OC1Init(TIM12, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
TIM_OC1PreloadConfig(TIM12, TIM_OCPreload_Enable); //CH1 预装载使能
TIM_OCInitStructure.TIM_Pulse = 2; //设置待装入捕获比较寄存器的脉冲值
TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //OC1 高电平有效
TIM_OC2Init(TIM12, &TIM_OCInitStructure); //根据指定的参数初始化外设 TIMx
TIM_OC2PreloadConfig(TIM12, TIM_OCPreload_Enable); //CH1 预装载使能
TIM_ARRPreloadConfig(TIM12,ENABLE);//ARPE使能
TIM_Cmd(TIM12, DISABLE);
}
//P1--定时器1的两个通道CH1-E9 --CH2-E11
void Motor1Pwm(int DutyTemp)
{
if(DutyTemp==0)
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,0);
return;
}
if(DutyTemp>4000) DutyTemp = 4000; //输出PWM限幅
if(DutyTemp<-4000)DutyTemp = -4000;
if(DutyTemp>0)
{
TIM_SetCompare1(TIM1,DutyTemp);
TIM_SetCompare2(TIM1,0);
}
else
{
TIM_SetCompare1(TIM1,0);
TIM_SetCompare2(TIM1,-DutyTemp);
}
}
//P2--定时器1的两个通道CH3-E13 -CH4-E14
void Motor2Pwm(int DutyTemp)
{
if(DutyTemp==0)
{
TIM_SetCompare3(TIM1,0);
TIM_SetCompare4(TIM1,0);
return;
}
if(DutyTemp>4000) DutyTemp = 4000; //输出PWM限幅
if(DutyTemp<-4000)DutyTemp = -4000;
if(DutyTemp>0)
{
TIM_SetCompare3(TIM1,DutyTemp);
TIM_SetCompare4(TIM1,0);
}
else
{
TIM_SetCompare3(TIM1,0);
TIM_SetCompare4(TIM1,-DutyTemp);
}
}
//P3--定时器9的两个通道CH1 E5 --CH2-E6
void Motor3Pwm(int DutyTemp)
{
if(DutyTemp==0)
{
TIM_SetCompare1(TIM9,0);
TIM_SetCompare2(TIM9,0);
return;
}
if(DutyTemp>4000) DutyTemp = 4000; //输出PWM限幅
if(DutyTemp<-4000)DutyTemp = -4000;
if(DutyTemp>0)
{
TIM_SetCompare1(TIM9,DutyTemp);
TIM_SetCompare2(TIM9,0);
}
else
{
TIM_SetCompare1(TIM9,0);
TIM_SetCompare2(TIM9,-DutyTemp);
}
}
//P4 定时器12的两个通道CH1(PB14)CH2-PB15
void Motor4Pwm(int DutyTemp)
{
if(DutyTemp==0)
{
TIM_SetCompare1(TIM12,0);
TIM_SetCompare2(TIM12,0);
return;
}
if(DutyTemp>4000) DutyTemp = 4000; //输出PWM限幅
if(DutyTemp<-4000)DutyTemp = -4000;
if(DutyTemp>0)
{
TIM_SetCompare1(TIM12,DutyTemp);
TIM_SetCompare2(TIM12,0);
}
else
{
TIM_SetCompare1(TIM12,0);
TIM_SetCompare2(TIM12,-DutyTemp);
}
}
main.c
#include "sys.h"
#include "usart.h"
#include "delay.h"
#include "led.h"
#include "beep.h"
#include "key.h"
#include "oled.h"
#include "extizd.h"
#include "BaseTimX.h"
#include "htimx.h"
#include "dcmotor2.h"
//第一步,包含这两个头文件
#include "IOI2C.h"
#include "MPU6050.h"
int int1=10;
int int2=12;
float float1=1.5;
float float2=10.25;
//关于陀螺仪的学习https://www.bilibili.com/video/BV15g411N7SM/?spm_id_from=333.788 ,第15讲1小时10分开始,看20分钟,获取陀螺仪的角速度
void oledPage0()
{
OLED_ShowChar(0,0,'Z');
OLED_ShowChar(1*8,0,'P');
OLED_ShowChar(2*8,0,'0');
OLED_ShowChar(4*8,0,'F');
OLED_ShowChar(5*8,0,'P');
OLED_ShowChar(6*8,0,'0');
OLED_ShowChar(0*8,1,'Z');
OLED_ShowChar(1*8,1,'S');
OLED_ShowChar(2*8,1,'1');
OLED_ShowChar(3*8,1,'0');
OLED_ShowChar(4*8,1,'0');
OLED_ShowChar(5*8,1,'0');
OLED_ShowChar(6*8,1,'F');
OLED_ShowChar(7*8,1,'S');
OLED_ShowChar(8*8,1,'0');
OLED_ShowChar(9*8,1,'.');
OLED_ShowChar(10*8,1,'0');
OLED_ShowChar(11*8,1,'1');
OLED_ShowChar(0,2,'k');
OLED_ShowChar(1*8,2,'m');
OLED_ShowChar(2*8,2,'0');
OLED_ShowChar(4*8,2,'a');
OLED_ShowChar(5*8,2,'s');
OLED_ShowChar(6*8,2,'0');
OLED_ShowChar(0*8,3,'z');
OLED_ShowChar(1*8,3,'s');
OLED_ShowChar(2*8,3,'0');
OLED_ShowChar(3*8,3,'=');
OLED_ShowChar(0*8,4,'x');
OLED_ShowChar(1*8,4,'s');
OLED_ShowChar(2*8,4,'0');
OLED_ShowChar(3*8,4,'=');
}
int main(void)
{
char sendcmd[50]={0};
u8 KeyVal=0;
//
// u32 intnum=0;
float a=123.456;
// int i=0;
//
// float xf=0,yf=0,zf=0;
// int xi=0,yi=0,zi=0;
delay_init(168);
LED_Init();
// BEEP_Init();//初始化
//
// EXTIX_Init();//主要是打开MPU6050的中断
//
// KEY_Init();
// OLED_Init();
// delay_ms(5);
// OLED_Clear();
KeyModeFlag=0;
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);
//oledPage0();
// BaseTimx_Init();
// TIM_Cmd(BASIC_TIM6, ENABLE);
// HTim8_Init();//初始化函数中,加一时间是1us,1000---1us===1ms
//
// TIM_Cmd(TIM8, ENABLE);
// HTim8_SetPwmFreq(50);//用定时器8控制舵机,需要频率是50HZ(周期是20ms)
HTim1_Init(4166-1,4-1);
TIM_Cmd(TIM1, ENABLE); //使能TIM14
TIM9_PWM_Init(4166-1,4-1);
TIM_Cmd(TIM9, ENABLE); //使能TIM9 10khz
TIM12_PWM_Init(4166-1,2-1);
TIM_Cmd(TIM12, ENABLE); //使能TIM14
// uart1_init(115200);
// uart2_init(9600);
// uart3_init(115200);
// uart4_init(115200);
uart6_init(115200);//需要用杜邦线连接,没预留,接线比较麻烦,非必要不连接
// printf("HELLo world\r\n");
// printf("HELLo world=%.2f\r\n",a);
// Printf(USART1,"usart1\r\n");
// Printf(USART2,"ok usart2\r\n");
// Printf(USART3,"ok usart3\r\n");
// Printf(UART4,"ok usart4\r\n");
//
// MPU_IIC_Init(); //=====IIC初始化 读取MPU6050数据
// MPU6050_initialize(); //=====MPU6050初始化
// DMP_Init();
while(1)
{
LED0=0;
Motor1Pwm(0.5*4166);
Motor2Pwm(0.5*4166);
Motor3Pwm(0.5*4166);
Motor4Pwm(0.5*4166);
delay_ms(2000);
Motor1Pwm(0);
Motor2Pwm(0);
Motor3Pwm(0);
Motor4Pwm(0);
delay_ms(2000);
LED0=1;
Motor1Pwm(-0.5*4166);
Motor2Pwm(-0.5*4166);
Motor3Pwm(-0.5*4166);
Motor4Pwm(-0.5*4166);
delay_ms(2000);
Motor1Pwm(0);
Motor2Pwm(0);
Motor3Pwm(0);
Motor4Pwm(0);
delay_ms(2000);
LED0=0;
Motor1Pwm(0.7*4166);
Motor2Pwm(0.7*4166);
Motor3Pwm(0.7*4166);
Motor4Pwm(0.7*4166);
delay_ms(2000);
Motor1Pwm(0);
Motor2Pwm(0);
Motor3Pwm(0);
Motor4Pwm(0);
delay_ms(2000);
LED0=1;
Motor1Pwm(-0.7*4166);
Motor2Pwm(-0.7*4166);
Motor3Pwm(-0.7*4166);
Motor4Pwm(-0.7*4166);
delay_ms(2000);
Motor1Pwm(0);
Motor2Pwm(0);
Motor3Pwm(0);
Motor4Pwm(0);
delay_ms(2000);
}
}