关于PWM 波形输出,来控制LED灯的亮度

2019-10-15 01:33发布

主函数:

#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "key.h"

#include "timer.h"
#include "pwm.h"










int main(void)
{               

         u16 led0pwmval=0;
         u8 dir=1;
         
         
         
        delay_init();                     //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
       
        LED_Init();                                  //初始化与LED连接的硬件接口
       
        TIM3_PWM_Init(899,0);    //不分频。PWM频率=72000/(899+1)=80Khz
       
       
                      
         
        //TIM3_Int_Init(4999,7199);   //10Khz=2*(36MHZ)/(7199+1)的计数频率,计数到5000为500ms(括号前面一个数就是设置计数次数的)
         
        while(1)
        {            
                 //LED0=!LED0;       
                //delay_ms(500);
               
                delay_ms(10);
                if(dir)led0pwmval++;
                else  led0pwmval--;
                if(led0pwmval>300) dir=0;
               
                if(led0pwmval==0) dir=1;
                TIM_SetCompare3(TIM3,led0pwmval);
        }  
       
}



pwm.c


#include "pwm.h"
#include "led.h"

//PWM输出初始化
//arr :自动重装载值
//psc: 时钟预分频数

void TIM3_PWM_Init(u16 arr,u16 psc)
{
        GPIO_InitTypeDef  GPIO_InitStructure;
       
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseInitStructure;  
       
        TIM_OCInitTypeDef   TIM_OCInitStructure;
       
       
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);    // ① 使能GPIO外设时钟   
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE); //  ① 使能TIM3的时钟
       
        // GPIO_PinRemapConfig(GPIO_PartialRemap_TIM3, ENABLE); //Timer3部分重映射  TIM3_CH3->PB0
       
       
        //,输出TIM3 _CH3的PWM脉冲波形
       
        GPIO_InitStructure.GPIO_Pin=GPIO_Pin_0;    //TIM3 _CH3
        GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;   //复用推挽输出
        GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //输出频率
        GPIO_Init(GPIOB,&GPIO_InitStructure);     //初始化GPIOB.0
       
       
       
        TIM_TimeBaseInitStructure.TIM_Period=arr;   //设置在下一个更新事件装入活动的自动重装载寄存器周期的值
        TIM_TimeBaseInitStructure.TIM_Prescaler=psc;   //设置用来作为TIMx时钟频率消除的预分频值   不分频
        TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1;    //设置时钟分割:TDTS=Tck_tim
        TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式
        TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStructure);       //   ② 初始化 TIM3
       
       
       
        //这里,使用的是通道3,
       
        TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;   //脉宽调制模式2
        TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;  //比较输出使能
       
        TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;  //输出极性高
        TIM_OC3Init(TIM3,&TIM_OCInitStructure);         // ③ 初始化外设 TIM3     
         
         
         

        TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);    // CH3预装载使能
       
        //TIM_ARRPreloadConfig(TIM3,ENABLE);    // 使能TIMx在ARR上的预装载寄存器
       
        TIM_Cmd(TIM3,ENABLE);   //④ 使能TIM3寄存器
         
         
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
21条回答
arao和xiaomi
1楼-- · 2019-10-16 20:41
 精彩回答 2  元偷偷看……
arao和xiaomi
2楼-- · 2019-10-16 21:01
feilusia 发表于 2017-1-9 09:20
我个性签名档的博客地址,《STM32之timer3产生PWM》。

你好,我看了一下你的程序,请教一下那个TIM3的CH3通道通过PB0通道输出PWM,需要用到端口复用吗?
arao和xiaomi
3楼-- · 2019-10-17 01:04
夜乄歌 发表于 2017-1-9 16:23
你要看你是否改变了PWM的占空比,占空比不改变亮度肯定不变了,如果改变的WPM占空比找个示波器看看引脚波形 ...

这个观察PB0管脚的占空比是否变化只能通过示波器来看嘛?能不能通过KEIL5里面自带的软件仿真功能来观察呀?
夜乄歌
4楼-- · 2019-10-17 03:02
arao和xiaomi 发表于 2017-1-9 16:34
这个观察PB0管脚的占空比是否变化只能通过示波器来看嘛?能不能通过KEIL5里面自带的软件仿真功能来观察呀 ...

可以,但是没示波器直接看直观
arao和xiaomi
5楼-- · 2019-10-17 06:36
夜乄歌 发表于 2017-1-9 16:37
可以,但是没示波器直接看直观

示波器的两个管脚一个接PB0另外一个接哪里呀?
还有就是如果软件观察的话,是观察PB0的bit位还是state还是analog呀?
arao和xiaomi
6楼-- · 2019-10-17 09:22
 精彩回答 2  元偷偷看……

一周热门 更多>