赞
踩
通过比较CNT和CCR寄存器的值,来对输出电平进行置1、置0或翻转的操作,用于输出一定频率和占空比的PWM波
每个高级定时器和通用定时器都拥有4个输出比较通道
高级定时器的前3个通道额外拥有死区生成和互补输出的功能
PWM简称脉冲宽度调制,在惯性系统中,对一系列脉冲宽度进行调制,将数字信号等效为所需的模拟信号,用于控制电机速率。
频率 = 1 / TS 占空比 = TON / TS 分辨率 = 占空比变化步距
在本次实验中,使用PWM模式1向上计数,当CNT<CCR时,REF置有效电平,CNT>=CCR时,REF置无效电平。下图中红线部分位CCR,蓝线位CNT。黄线为ARR值。
PWM频率: Freq = CK_PSC / (PSC + 1) / (ARR + 1)
PWM占空比: Duty = CCR / (ARR + 1)
PWM分辨率: Reso = 1 / (ARR + 1)
(1).开启时钟TIM2的时钟
(2).开启GPIOA时钟
(3).GPIOA结构体初始化
注意本次实验是用定时器控制GPIO引脚要选择复用开漏输出或者复用推挽输出。
普通的引脚控制权是来自于输出数据寄存器,只需要选择普通的开漏输出或者是推挽输出。
(4).配置时钟源,选择TIM2为内部时钟
(5).时基单元初始化
(6).配置捕获单元在TIM2的OC1通道上输出PWM波形
- #include "stm32f10x.h" // Device header
-
-
- void PWM_Init(void)
- {
- //1开启时钟TIM2的时钟线是APB1
- RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
- //2.开启GPIOA时钟
- RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
- //开启AFIO时钟,将GPIO引脚从PA0移到PA15
- //RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);//打开AFIO时钟
- //GPIO_PinRemapConfig(GPIO_PartialRemap2_TIM2,ENABLE);//再用AFIO重映射外设复用的引脚
- //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//刚好是JTAG调试端口,解除JTAG调试端口,保留swlink
- //3.结构体初始化
- GPIO_InitTypeDef GPIO_Inistructure;
- GPIO_Inistructure.GPIO_Mode= GPIO_Mode_AF_PP;//复用推挽输出,用计时器(片上外设控制GPIO引脚,选择复用推挽输出)
- GPIO_Inistructure.GPIO_Pin=GPIO_Pin_0;
- GPIO_Inistructure.GPIO_Speed= GPIO_Speed_50MHz;
- GPIO_Init(GPIOA,&GPIO_Inistructure);//读取结构体的参数
- //4.配置时钟源,选择TIM2为内部时钟
- TIM_InternalClockConfig(TIM2);
- //5.时基单元初始化
- TIM_TimeBaseInitTypeDef TIM_timBaseInitStructure;
- TIM_timBaseInitStructure.TIM_ClockDivision= TIM_CKD_DIV1;//一分频
- TIM_timBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up;//向上计数
- TIM_timBaseInitStructure.TIM_Period=100-1;//ARR
- TIM_timBaseInitStructure.TIM_Prescaler=720-1;//PSC
- TIM_timBaseInitStructure.TIM_RepetitionCounter=0;//重复计数器是高级定时器才有的
- TIM_TimeBaseInit(TIM2,&TIM_timBaseInitStructure);
- //6.配置捕获单元在TIM2的OC1通道上输出PWM波形
- 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_OC1Init(TIM2,&TIM_OCInitStructure);
- TIM_Cmd(TIM2,ENABLE);//开启定时器
- //产生1KHZ,分辨率为1%。占空比为50%的PWM
- }
-
-
- //设置CCR的值
- void PWM_SetCompare1(uint16_t Compare)
- {
- TIM_SetCompare1(TIM2,Compare);
- }

- #include "stm32f10x.h" // Device header
- #include "Delay.h"
- #include "OLED.h"
- #include "PWM.h"
-
- uint8_t i; //定义for循环的变量
-
- int main(void)
- {
- /*模块初始化*/
- OLED_Init(); //OLED初始化
- PWM_Init(); //PWM初始化
-
- while (1)
- {
- for (i = 0; i <= 100; i++)
- {
- PWM_SetCompare1(i); //依次将定时器的CCR寄存器设置为0~100,PWM占空比逐渐增大,LED逐渐变亮
- Delay_ms(10); //延时10ms
- }
- for (i = 0; i <= 100; i++)
- {
- PWM_SetCompare1(100 - i); //依次将定时器的CCR寄存器设置为100~0,PWM占空比逐渐减小,LED逐渐变暗
- Delay_ms(10); //延时10ms
- }
- }
- }

舵机是一种根据输入PWM信号占空比来控制输出角度的装置
输入PWM信号要求:周期为20ms,高电平宽度为0.5ms~2.5ms
直流电机是一种将电能转换为机械能的装置,有两个电极,当电极正接时,电机正转,当电极反接时,电机反转 直流电机属于大功率器件,GPIO口无法直接驱动,需要配合电机驱动电路来操作 TB6612是一款双路H桥型的直流电机驱动芯片,可以驱动两个直流电机并且控制其转速和方向
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。