5.2江科大STM32学习之TIM输出比较(PWM)

1.什么是输出比较

aa2a1da567f24a9a9b1e78b6e259ba2c.png

8cbdbe696a744044a1377db84da46a44.png

2.PWM简介

63109960cd4d48698822bd365edbd8cd.png

1dda69cc3243491ca6330f2f40160063.png8c027976e0124fdd81f5455f553df210.png

3.常用PWM模式

c52fa2cfefcd45c48795dc507d87c6b0.png

3.PWM基本结构

87555a3b2f7446649a339f49fa7ca04e.png

dc40e140d80d4f6bae7f539c52fa4d87.png

40c76149b0c34f8283137197e1e89f17.png

f258e3b9b7804a0096ae89a0b8f6f5bd.png

推挽电路三种状态

上管导通下管断开输出高电平

下管导通上管断开输出低电平

上下都断开输出高阻态

4.舵机简介

27415e2d677b45f7a47199e768c6d7bc.png

bb66f0d5fd494fb1a9efedddadc3474e.png

5.什么是直流电机

a1ec1c1bdf804cafa992ffbbf956db9f.png

6e5ea79b63ae41619ec9168c358c3b4c.png

6.电机驱动模块硬件电路

32a1c15ffdec48148796b8d2b7f43cd7.png

7.PWM接线图

0874347e842946ed97496c778e550394.png

通过PA0驱动LED:占空比越大LED越亮,占空比越小LED越暗

TIM_OC1Init(配置数字比较初始化)

TIM_OCStructInit(给输出比较赋一个默认值)

TIM_ForcedOC1Config(配置强制输出模式,暂停输出波形并强制输出高低电平)

TIM_OC1PreloadConfig(配置OC预装功能)

TIM_OC1FastConfig(配置使能)

TIM_ClearOC1Ref(外部事件中清除REF事件)

*结构体初始化那里也可以设置极性与这个地方设置极性一样

TIM_OC1PolarityConfig(配置输出比较高极性)

TIM_OC1NPolarityConfig(配置输出比较低极性)

TIM_CCxCmd(修改输出使能参数的)

TIM_SelectOCxM(更改输出比较函数)

TIM_SetCompare1(单独更改输出寄存器值的函数)

TIM_CtrlPWMOutputs(仅高级寄存器实用PWM输出波形调用其函数)

8.TIM_OCInitTypeDef配置思路

TIM_OCMode:设置输出比较模式

TIM_OCPolarity:设置输出极性

TIM_OutputState:设置输出使能

TIM_Pulse:初始的CCR值

因为你没有给结构体全部函数调用所以可能会导致结构体变量内存布局混乱导致硬件出现问题

所以先用TIM_OCStructInit这个函数先把结构体初始化一下

就相当于先给结构体全部赋值了一遍,然后把其内部的值在修改

bb07669040614233a8100f465bb7d928.png

6a405d3e78e445439e53fe6303476255.png

当你同时想使用USART2_TX以及TIM2_CH3但是他们的引脚又是同一个引脚PA2咋办,

当当当当!AFIO(重映射)这个功能就是将有一些相同通道功能映射到另一个引脚上(映射表上要有)比如TIM2_CH3在PB10上能重映射,所以你就可以用AFIO将其映射到PB10上,然后就能同时用USART2_TX和TIM2_CH3

ab0b1e8d6af041adb7cf48d1d817ea5c.png

为什么用复用推挽输出:相比较推挽输出输出控制有数据寄存器控制,复用推挽输出则用片上外设控制,引脚控制权交给片上外设,PWM波形才能通过引脚输出

6f52968b00e745f6aa444666a9d576c8.png

计算ARR=100-1,CCR=50,PSC=720-1,频率为1KHZ占空比为50%波形、

TIM_InternalClockConfig(将TIM2设置为外部时钟)

TIM_SetCompare1设置CCR的值根据上面个公式CCR减小占空比减小灯越暗

9.重映射思路

1.开启AFIO时钟:RCC_APB2PeriphClockCmd

2.GPIO_PinRemapConfig(重映射关系)

aec39e9cb0154ac9afb9734b29cd354c.png

de548047799340e6b8f82b047e2ae1af.png

ded54ba8d33a4cc290cd86834e23ea16.png

因为PA15是默认为JTDI所以要使用就要先关闭调试功能使用

5854394c83604272b662d78824e5f415.png

通过这三个参数解除调试功能禁用

GPIO_Remap_SWJ_NoJTRST这个函数解除NJTRST

cf1249ea66e14ca694c810e1d66d297e.png

GPIO_Remap_SWJ_JTAGDisable,解除JTAG保留SWD复用

 

0d7ee537c88e446ba0d428b9d365cc68.png

不要随便用SWJ_Disable:这个函数使用了就代表St_link无法下载了,要重新烧录

a72ab6b3104d43bda1274a7937c89049.png

 

 

10.舵机实验接线图

605e6f0e2ba2417d8f052fd90852cfb5.png

27415e2d677b45f7a47199e768c6d7bc.png19ac819728954acc86a39789c6448116.png

PSC和ARR的值可以自己安排

占空比duty=CCR/20K,

CCR可以TIM_SetCompare1设置输入信号脉冲宽度,

当CCR=0.5ms时为0度,2500时为180度,1500时为90度

因为舵机要求周期为20ms,所以他的频率为1/20ms=50HZ

18d1022e69b94d07a590cabd5664ce14.png

y=Kx+b

10.直流电机电路图

7a79e9a8062b4c15923c256f5624a8cc.png

A01接正,AO2接负,若是接反了则电机会反转

STBY待机,因为咱们不需要待机,所以直接接高电平,

AIN1与AIN2是方向控制引脚任意接两个GPIO

PWMA是速度控制引脚

11直流电机思路

void PWM_Init(void)
{
	/*开启时钟*/
	RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2, ENABLE);			//开启TIM2的时钟
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);			//开启GPIOA的时钟
	
	/*GPIO初始化*/
	GPIO_InitTypeDef GPIO_InitStructure;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_Init(GPIOA, &GPIO_InitStructure);							//将PA2引脚初始化为复用推挽输出	
																	//受外设控制的引脚,均需要配置为复用模式
	
	/*配置时钟源*/
	TIM_InternalClockConfig(TIM2);		//选择TIM2为内部时钟,若不调用此函数,TIM默认也为内部时钟
	
	/*时基单元初始化*/
	TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure;				//定义结构体变量
	TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;     //时钟分频,选择不分频,此参数用于配置滤波器时钟,不影响时基单元功能
	TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up; //计数器模式,选择向上计数
	TIM_TimeBaseInitStructure.TIM_Period = 100 - 1;                 //计数周期,即ARR的值
	TIM_TimeBaseInitStructure.TIM_Prescaler = 36 - 1;               //预分频器,即PSC的值
	TIM_TimeBaseInitStructure.TIM_RepetitionCounter = 0;            //重复计数器,高级定时器才会用到
	TIM_TimeBaseInit(TIM2, &TIM_TimeBaseInitStructure);             //将结构体变量交给TIM_TimeBaseInit,配置TIM2的时基单元
	
	/*输出比较初始化*/ 
	TIM_OCInitTypeDef TIM_OCInitStructure;							//定义结构体变量
	TIM_OCStructInit(&TIM_OCInitStructure);                         //结构体初始化,若结构体没有完整赋值
	                                                                //则最好执行此函数,给结构体所有成员都赋一个默认值
	                                                                //避免结构体初值不确定的问题
	TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;               //输出比较模式,选择PWM模式1
	TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;       //输出极性,选择为高,若选择极性为低,则输出高低电平取反
	TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;   //输出使能
	TIM_OCInitStructure.TIM_Pulse = 0;								//初始的CCR值
	TIM_OC3Init(TIM2, &TIM_OCInitStructure);                        //将结构体变量交给TIM_OC3Init,配置TIM2的输出比较通道3
	
	/*TIM使能*/
	TIM_Cmd(TIM2, ENABLE);			//使能TIM2,定时器开始运行
}

4ee60dd17dcf48ffb69ba81ac2575577.png

73a02cecc1fe42f49f2fb8964bd99174.png

然后设置一边电压高一边电压低形成电压差,PWM_SetCompare3来控制电机转的速度

因为电机想起来有嗡嗡的声音

9876cc25828c4be391a3795b5c3c09e5.png

目前频率为:72MHZ/720/100=1KHZ

人耳能听到频率为20HZ到20KHZ,所以加大频率通过改变预分频器PSC频率可以不影响占空比

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值