关于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 02:00
你要看你是否改变了PWM的占空比,占空比不改变亮度肯定不变了,如果改变的WPM占空比找个示波器看看引脚波形是否改变了,如果也是改变了那就加大占空比的量,我之前做的时候也是这样RGB灯亮度基本不变,后来发现PWM占空比的太大了
arao和xiaomi
2楼-- · 2019-10-15 03:12
求助,学习pwm来控制LED灯的亮度的实验,然后跟着视频写的代码,但是下载到开发板里面去却没有现象,现象是LED0(PB0脚相连的)灯一直是亮的,但是亮度不发生变化
arao和xiaomi
3楼-- · 2019-10-15 06:01
 精彩回答 2  元偷偷看……
arao和xiaomi
4楼-- · 2019-10-15 10:56
arao和xiaomi 发表于 2017-1-8 22:14
跟着视频和例程找了好久,都不知道是哪里出了错,求助

还有就是我想看一下例程里面那个LED管脚输出的PWM波形,但是不知道怎么设置。这个好像和一般的控制IO脚的输出观看bit位的状态不一样吧?
lihilong
5楼-- · 2019-10-15 14:57
你的有些语句被注释掉了吧?
密耳
6楼-- · 2019-10-15 15:04

一周热门 更多>