IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 嵌入式 -> dcmotor2双PWM的定时器分配,代码 -> 正文阅读

[嵌入式]dcmotor2双PWM的定时器分配,代码

由于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);
	}
}


  嵌入式 最新文章
基于高精度单片机开发红外测温仪方案
89C51单片机与DAC0832
基于51单片机宠物自动投料喂食器控制系统仿
《痞子衡嵌入式半月刊》 第 68 期
多思计组实验实验七 简单模型机实验
CSC7720
启明智显分享| ESP32学习笔记参考--PWM(脉冲
STM32初探
STM32 总结
【STM32】CubeMX例程四---定时器中断(附工
上一篇文章      下一篇文章      查看所有文章
加:2022-05-05 11:35:52  更:2022-05-05 11:38:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 3:56:17-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码