关于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条回答
命运枷锁
1楼-- · 2019-10-15 19:43
你的重映射时钟开启了吗?
命运枷锁
2楼-- · 2019-10-16 01:10
 精彩回答 2  元偷偷看……
feilusia
3楼-- · 2019-10-16 04:28
我个性签名档的博客地址,《STM32之timer3产生PWM》。
YUSHI
4楼-- · 2019-10-16 05:42
居然还有代码卖,水深啊
arao和xiaomi
5楼-- · 2019-10-16 10:56
命运枷锁 发表于 2017-1-9 08:57
你的重映射时钟开启了吗?

我的PB0端口就是接的LED0 ,然后我看那个手册TIM3的CH3通道在PB0端口不需要重映射的吧?
arao和xiaomi
6楼-- · 2019-10-16 15:52
lihilong 发表于 2017-1-8 22:28
你的有些语句被注释掉了吧?

你是说的那个端口复用语句吗?这个我也尝试过了,不过我查了一下手册,那个TIM3的CH3通道通过PB0端口输出好像不用端口复用的吧?

一周热门 更多>