STM32实验六:PWM输出实验总结

实验目标:使用STM32定时器来产生PWM输出,使用TIM1通道1产生PWM来控制DS0亮度

什么是PWM?脉冲宽度调制,Pulse Width Modulation的缩写,简称脉宽调制,利用微处理器数字输出来对模拟电路进行控制。

假设定时器工作在向上计数PWM模式,CNT小于CRRx时输出0,CNT>=CCRx时输出1,可以得到上面这样的示意图。改变CCRx的值就可以改变PWM输出的占空比,改变ARR的值就可以改变PWM输出的频率,这就是PWM输出原理。

32除了6、7其他的定时器都可以产生PWM,1,8可以产生多达7路同时PWM输出。所以我们的32能够同时产生30路PWM输出。

要让TIM1产生PWM输出,除了上一章的4个寄存器我们还需要另外4个:

1、捕获比较模式寄存器 TIMx_CCMR1/2

2、捕获比较使能寄存器 TIMx_CCER

3、捕获比较寄存器TIMx_CCR1~4

4、刹车和死区寄存器TIMx_BDTR

第一个:捕获比较模式寄存器

一共有两个,TIMx_CCMR1控制1和2,~2控制CH3和4.

模式设置为OCxM,三部分组成,总共可以组成7种模式。PWM模式使用110/111

第二个:捕获比较使能寄存器

想要PWM从IO口输出,这个位必须设置为1。

第三个:捕获/比较寄存器

对应4个通道CH1~4,这4个寄存器都差不多。输出模式下寄存器的值与CNT的值进行比较,根据比较结果产生相应的动作,通过更改这个寄存器的值就可以控制PWM的输出脉宽了。我们使用TIM1的通道1来实现脉宽控制DS0的亮度。

通用定时器配置上面三个就可以了,如果是高级定时器还需要配置:刹车和死区寄存器

第四个:刹车和死区寄存器

我们只关注最高位MOE位,想要高级定时器PWM正常输出必须设置MOE为1.

下面我们介绍配置TIM1CH1的步骤来输出PWm控制DS0的亮度

1)开启TIM1时钟,配置PA8复用输出

使能时钟:

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //使能定时器3时

复用输出:

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出 

2)设置TIM1的ARR和PSC

设置ARR 和PSC两个寄存器的追来控制输出PWM的周期,如果PWM太慢就会明显感觉到杉树了,所以需要合适。通过TIM_TimebaseInit来实现,调用格式:

TIM_TimeBaseStructure.TIM_Period = arr; //设置自动重装载值 TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置预分频值 TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割 :TDTS = Tck_tim TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //向上计数模式 TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //根据指定的参数初始化 

3)设置TIM1_CH1的PWM模式和通道方向,使能TIM1的CH1输出

接下来设置TIM1_CH1为PWM模式,默认是冻结的。因为我们的DS0时低电平亮,而我们希望CCR1小的时候DS0暗,所以我们要通过配置TIM1_CCMR1的相关位来控制TIM1Ch1的模式。库函数中PWM通道设置通过TIM_OC1Init()~4来设置,不同通道的设置函数不一样。

函数是:

void TIM_OC1Init(TIM_TypeDef* TIMx, TIM_OCInitTypeDef* TIM_OCInitStruct);

结构体中我们要研究的参数有:

TIM_OutputState来设置呼出使能,也就是PWM输出到的端口

TIM_OCPolarity用来设置极性高低

所以最后的标准代码是:

TIM_OCInitTypeDef TIM_OCInitStructure;

TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2; //选择 PWM模式 2 TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性高

TIM_OC1Init(TIM1, &TIM_OCInitStructure); //初始化 TIM1 OC1

4)使能TIM1

TIM_Cmd(TIM1, ENABLE); //使能 TIM1

5)设置MOE输出,使能PWM输出

TIM_CtrlPWMOutputs(TIM1,ENABLE); // MOE主输出使能

6)修改TIM1_CCR1来控制占空比

经过上面的设置以后PWM已经开始输出了,但是占空比和频率是固定的,所以我们可以通过修改CCR1来控制Ch1的输出占空比,进而控制DS0的亮度。

void TIM_SetCompare1(TIM_TypeDef* TIMx, uint16_t Compare1);

硬件部分:DS0,TIM3,使用到了TIM1CH1通道进行输出,他和PA8是相连的所以电路上没有变化。

软件部分

pwm.c文件

和我们上面说的5个步骤一样,最后看主函数

 int main(void)
 {    
    u16 led0pwmval=0;    
    u8 dir=1;    
    delay_init();             //延时函数初始化      
    LED_Init();              //初始化与LED连接的硬件接口
    TIM1_PWM_Init(899,0);//不分频。PWM频率=72000/(899+1)=80Khz 
       while(1)
    {
         delay_ms(10);     
        if(dir)led0pwmval++;
        else led0pwmval--;     
         if(led0pwmval>300)dir=0;
        if(led0pwmval==0)dir=1;                            
        TIM_SetCompare1(TIM1,led0pwmval);       
    } 
}

我们控制LED0_PWM_VAL从0变到300又变回0,整个软件设置完成
 

  • 3
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值