STM32F103之脉冲宽度调制(PWM)模块开发(含呼吸灯实例源代码)

图片


《《《《《正文》》》》》


 

《加载库文件》

图片


 

《硬件设计》

图片

图片

看手册可以知道:

*       TIM3 CH1(PWM1) -> PA6

*         TIM3 CH2(PWM2) -> PA7

*         TIM3 CH3(PWM3) -> PB0

*         TIM3 CH4(PWM4) -> PB1

 

《软件设计》

设计4路PWM控制的LED;

1、初始化函数,

这里需要注意的是下面这个配置项:

TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low/TIM_OCPolarity_High,意思是输出比较极性的配置,就是表示输出高低的设置,我上面LED的电路是上拉VDD,因此有效电平为GPIO输出低电平led才会亮,因此这里就要设置成低;其实这个就是低电平起还是高电平起;

/******************************************************************************************* 函  数:void PWM_Init(void)* 功  能:LED引脚初始化 以及TIM3 配置输出PWM* 参  数:无* 返回值:无* 备  注:TIM3 CH1(PWM1) -> PA6*         TIM3 CH2(PWM2) -> PA7*         TIM3 CH3(PWM3) -> PB0*         TIM3 CH4(PWM4) -> PB1*******************************************************************************************/void PWM_Init(void){  GPIO_InitTypeDef GPIO_InitStruct;   //定义GPIO结构体变量  TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;   //定义定时器结构体变量  TIM_OCInitTypeDef TIM_OCInitStruct;   //定义输出比较结构体变量    RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_AFIO,ENABLE);   //GPIOA、B、复用时钟使能  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3,ENABLE);   //使能TIM3的时钟    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_6|GPIO_Pin_7;   //配置GPIO第6、7引脚  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;       //配置GPIO为复用推挽输出  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;      //配置GPIO速率  GPIO_Init(GPIOA,&GPIO_InitStruct);   //GPIO初始化函数    GPIO_InitStruct.GPIO_Pin=GPIO_Pin_0|GPIO_Pin_1;   //配置GPIO第0、1引脚  GPIO_InitStruct.GPIO_Mode=GPIO_Mode_AF_PP;       //配置GPIO为复用推挽输出  GPIO_InitStruct.GPIO_Speed=GPIO_Speed_50MHz;       //配置GPIO速率  GPIO_Init(GPIOB,&GPIO_InitStruct);   //GPIO初始化函数    TIM_TimeBaseInitStruct.TIM_Period=1000-1;       //设置自动重装载的周期值  TIM_TimeBaseInitStruct.TIM_Prescaler=100;       //设置预分频值  TIM_TimeBaseInitStruct.TIM_CounterMode=TIM_CounterMode_Up; //向上计数模式  TIM_TimeBaseInitStruct.TIM_ClockDivision=TIM_CKD_DIV1;     //设置时钟分割  TIM_TimeBaseInit(TIM3,&TIM_TimeBaseInitStruct);          //定时器初始化函数    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;   //PWM模式1  TIM_OCInitStruct.TIM_Pulse=0;                  //初始化占空比为0  TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;        //输出比较极性低  TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;   //比较输出使能  TIM_OC1Init(TIM3,&TIM_OCInitStruct);                //比较输出初始化函数  TIM_OC1PreloadConfig(TIM3,TIM_OCPreload_Enable);   //输出比较1预装载寄存器使能    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;   //PWM模式1  TIM_OCInitStruct.TIM_Pulse=0;                    //初始化占空比为0  TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;       //输出比较极性低  TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;     //比较输出使能  TIM_OC2Init(TIM3,&TIM_OCInitStruct);               //比较输出初始化函数  TIM_OC2PreloadConfig(TIM3,TIM_OCPreload_Enable);   //输出比较2预装载寄存器使能    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;   //PWM模式1  TIM_OCInitStruct.TIM_Pulse=0;                 //初始化占空比为0  TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;       //输出比较极性低  TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;     //比较输出使能  TIM_OC3Init(TIM3,&TIM_OCInitStruct);               //比较输出初始化函数  TIM_OC3PreloadConfig(TIM3,TIM_OCPreload_Enable);   //输出比较3预装载寄存器使能    TIM_OCInitStruct.TIM_OCMode=TIM_OCMode_PWM1;   //PWM模式1  TIM_OCInitStruct.TIM_Pulse=0;                 //初始化占空比为0  TIM_OCInitStruct.TIM_OCPolarity=TIM_OCPolarity_Low;       //输出比较极性低  TIM_OCInitStruct.TIM_OutputState=TIM_OutputState_Enable;     //比较输出使能  TIM_OC4Init(TIM3,&TIM_OCInitStruct);               //比较输出初始化函数  TIM_OC4PreloadConfig(TIM3,TIM_OCPreload_Enable);   //输出比较4预装载寄存器使能    TIM_Cmd(TIM3,ENABLE);   //TIM3使能}


2、占空比控制函数

/************************************************************************************************* 函  数:void LED_Pwm(int16_t LED1_PWM,int16_t LED2_PWM,int16_t LED3_PWM,int16_t LED4_PWM)* 功  能:LED要输出数值转换成PWM波形输出* 参  数:LED1_PWM LED1*         LED2_PWM LED2*         LED3_PWM LED3*         LED4_PWM LED4* 返回值:无 * 备  注:无************************************************************************************************/void LED_Pwm(int16_t LED1_PWM,int16_t LED2_PWM,int16_t LED3_PWM,int16_t LED4_PWM){    
  TIM3->CCR1 = LED1_PWM;  TIM3->CCR2 = LED2_PWM;  TIM3->CCR3 = LED3_PWM;  TIM3->CCR4 = LED4_PWM;}

3、主函数,产生0%,40%,80%,100%的占空比电平,点亮不同的LED亮度;

int main(void){  PWM_Init();    for(;;)  {    LED_Pwm(0,400,800,1000);  }}


 

《呼吸灯设计》

其中延时模块参考:

STM32F103之systick延时(SYSTICK)模块开发

int main(void){  uint16_t tmp_pwm=0;  uint8_t  pwmFlag = 1;  PWM_Init();  Delay_Init(); //延时初始化,可看我的systick模块文章   for(;;)  {    Delay_ms(20);   //每20ms改变一次 延时函数    LED_Pwm(tmp_pwm,0,0,0);    if(pwmFlag) //递加     {      tmp_pwm+=100;  //一次改变10%的占空比      if(tmp_pwm>1000)      {        tmp_pwm =1000;        pwmFlag = 0;      }          }    else//递减    {      tmp_pwm-=100;      if(tmp_pwm==0)      {        tmp_pwm =0;//一次改变10%的占空比        pwmFlag = 1;      }    }  }}

源代码:

链接:https://pan.baidu.com/s/141UWzjFweWzLgFEaNgEHrQ

关注公众号,发送1234获取提取码;

 


 

 

《《《《《END》》》》》

图片

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值