pwm预习报告

PWM功能引脚,定义和过程

脉冲宽度调制(PWM),是英文“Pulse Width Modulation”的缩写,简称脉宽调制,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。简单一点,就是对脉冲宽度的控制。一般用来控制步进电机的速度等等。

stm32的pwm输出引脚是使用的IO口的复用功能。其中T2~T5这4个通用定时器均可输出4路PWM——CH1~CH4。

Pwm输出最基本的调节就是频率和占空比。频率当然又和时钟信号扯上了关系。
pwm主要就是控制频率和占空比的:这两个因素分别通过两个寄存器控制:TIMX_ARR和TIMX_CCRX。
ARR寄存器就是自动重装寄存器,也就是计数器记到这个数以后清零再开始计,这样pwm的频率就是tim_frequency/(TIMX_ARR-1)。在计数时会不停的和CCRX寄存器中的数据进行比较,如果小于的话是高电平或者低电平,计数值大于CCRX值的话电平极性反相。所以这也就控制了占空比

使用的引脚是PF9和PF10

PWM设置代码,主要实现了计时器和端口时钟使能,设置GPIO端口复用,设置IO的速度,工作模式以及设置PWM的频率和占空比。

//TIM14 PWM部分初始化 
//PWM输出初始化
void TIM14_PWM_Init(u32 arr,u32 psc)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef  TIM_OCInitStructure;

    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM14,ENABLE);      //TIM14时钟使能    
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE);     //使能PORTF时钟    

    GPIO_PinAFConfig(GPIOF,GPIO_PinSource9,GPIO_AF_TIM14); //GPIOF9复用为定时器14

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;           //GPIOF9
    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(GPIOF,&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(TIM14,&TIM_TimeBaseStructure);//初始化定时器14
    //初始化TIM14 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(TIM14, &TIM_OCInitStructure);  //根据T指定的参数初始化外设TIM1 4OC1
    TIM_OC1PreloadConfig(TIM14, TIM_OCPreload_Enable);  //使能TIM14在CCR1上的预装载寄存器
  TIM_ARRPreloadConfig(TIM14,ENABLE);//ARPE使能
    TIM_Cmd(TIM14, ENABLE);  //使能TIM14
}  

AFRL和AFRH区别

这两个寄存器控制的是组内16个IO口的复用,其中每个IO引脚由四个位决定。
AFRL控制的是0~7号引脚
AFRH控制的是8~15号引脚
对于每个引脚的控制的四个位的值决定了该IO口的复用功能

定时器的基本原理

STM32中一共有11个定时器,其中2个高级控制定时器,4个普通定时器和2个基本定时器,以及2个看门狗定时器和1个系统嘀嗒定时器。

STM32 系列的CPU,有多达8个定时器,其中TIM1和TIM8是能够产生三对PWM互补输出的高级定时器,常用于三相电机的驱动,它们的时钟由APB2的输出产生。其它6个为普通定时器,时钟由APB1的输出产生。

STM32的PWM输出有两种模式,模式1和模式2,由TIMx_CCMRx寄存器中的OCxM位确定的(“110”为模式1,“111”为模式2)。模式1和模式2的区别如下:

110:PWM模式1-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为有效电平,否则为无效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为无效电平(OC1REF=0),否则为有效电平(OC1REF=1)。

111:PWM模式2-在向上计数时,一旦TIMx_CNT<TIMx_CCR1时通道1为无效电平,否则为有效电平;在向下计数时,一旦TIMx_CNT>TIMx_CCR1时通道1为有效电平,否则为无效电`平。

通用定时器TIMx是由APB1提供时钟

操作步骤:
1. 打开定时器的时钟信号
2. 配置四个寄存器的内容
计数寄存器
预分频器寄存器
自动装载寄存器
控制寄存器

IO复用基本原理

由于考虑到IO口的有限,为了节省IO资源,同时为了更好的协调IO之间的工作,所以有必要在适当的时候给IO口赋予不同的功能,一个IO口在不同的时候可以承担不同的工作,这就是IO的复用功能。

内置外设是与I/O口共用引出管脚(不同的功能对应同一管脚)STM32 所有内置外设的外部引脚都是与标准GPIO引脚复用的,如果有多个复用功能模块对应同一个引脚,只能使能其中之一,其它模块保持非使能状态。

STM32F4 系列微控制器 IO 引脚通过一个复用器连接到内置外设或模块。该复用器一次只允许一个外设的复用功能(AF)连接到对应的 IO 口。这个复用器经过相应寄存器(GPIOx_AFRH和GPIOx_AFRL)的配置之后就可以做不同的功能的应用。

不是每个 IO 口都可以复用为任意复用功能外设。

设置GPIO复用的步骤:
1. 先打开对应的 IO 时钟和复用功能外设时钟。
2. 我们在 GIPOx_MODER 寄存器中将所需 IO(对于串口 1 是 PA9,PA10)配置为复用功能(ADC 和 DAC 设置为模拟通道)。
3. 对 IO 口的其他参数,例如类型,上拉/下拉以及输出速度。在库函数中是通过 GPIO_Init 函数来实现的。
4. 配置 GPIOx_AFRL 或者 GPIOx_AFRH 寄存器,将 IO 连接到所需的 AFx。

TIMER输出PWM实现步骤

  1. 设置RCC时钟;
    主要利用是所提供的五个函数

  2. 设置GPIO时钟;
    GPIO模式应该设置为复用推挽输出GPIO_Mode_AF_PP

  3. 设置TIMx定时器的相关寄存器;

  4. 设置TIMx定时器的PWM相关寄存器。

首先要设置PWM模式(默认情况下PWM是冻结的),然后设置占空比(根据前面所述公式进行计算),再设置输出比较极性:当设置为High时,输出信号不反相,当设置为Low时,输出信号反相之后再输出。最重要是是要使能TIMx的输出状态和使能TIMx的PWM输出使能。

相关设置完成之后,就可以通过TIM_Cmd()来打开TIMx定时器,从而得到PWM输出了。

主函数代码

  • 背景
    DS0,连接在PF9。定时器14(TIM 14),使用TIM14的通道1(CH1),将TIM14_CH1输出到PF,从而实现PWM输出控制DS0的亮灭。

  • 代码

int main(void)
{ 
    u16 led0pwmval=0;    
    u8 dir=1;
    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//设置系统中断优先级分组2
    delay_init(168);  //初始化延时函数
    uart_init(115200);//初始化串口波特率115200
     TIM14_PWM_Init(500-1,84-1);    //84M/84=1M的计数频率,重装载值500,所以PWM频率为 1M/500=2Khz.     
   while(1) //实现从0~300递增到300后从300~0递减,循环
    {
         delay_ms(10);     
        if(dir)led0pwmval++;//dir==1 led0pwmval递增
        else led0pwmval--;    //dir==0 led0pwmval递减 
         if(led0pwmval>300)dir=0;//led0pwmval达到300后,方向改为递 
        if(led0pwmval==0)dir=1;    //led0pwmval递减到0后,方向改为递增

        TIM_SetCompare1(TIM14,led0pwmval);    //哦及修改比价值和占空比
    }
}
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值