OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2140|回复: 2

请问如何重置PWM

[复制链接]

1

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2018-6-8
在线时间
0 小时
发表于 2018-6-8 11:11:37 | 显示全部楼层 |阅读模式
12金钱
用PWM实现呼吸灯,希望按下按键可以关闭呼吸灯或者开启呼吸灯,现在开启呼吸灯后会从原来的亮度继续,希望实现的是开启的时候是重新开始的,也就是无论什么时候关闭呼吸灯,开启时都是从不亮慢慢变亮。相关代码如下main.c

[mw_shl_code=c,true]#include "stm32f10x.h"
#include "bsp_breathing.h"
extern uint8_t period_cnt;
extern uint8_t pwm_index;
/**
  * @brief  Ö÷oˉêy
  * @param  ÎT
  * @retval ÎT
  */
int main(void)
{                       
        int flag=1;
        GPIO_InitTypeDef GPIO_InitStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;       
        /* 3õê¼»ˉoôÎüμÆ */
       
        Key_GPIO_Config();
       

       

        while(1){
                        if( Key_Scan(GPIOA,GPIO_Pin_0) == 1  )
                {
                        if(flag==1){
                                TIM3_Breathing_Init();
                        }else{
                                TIM_ClearITPendingBit (TIM3, TIM_IT_Update);
                                period_cnt=0;
                                pwm_index=0;
                                TIM3->CCR3=0;
                                /* PWMÄ£ê½ÅäÖà */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                            //ÅäÖÃÎaPWMÄ£ê½1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Disable;        //ê1Äüêä3ö
  TIM_OCInitStructure.TIM_Pulse = 0;                                                                                                          //éèÖÃ3õê&#188WMÂö3å¿í¶èÎa0       
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;            //μ±¶¨ê±Æ÷¼ÆêyÖμD¡óúCCR1_Valê±ÎaμíμçÆ½

  TIM_OC3Init(TIM3, &TIM_OCInitStructure);                                                                                 //ê1Äüí¨μà3
                TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Disable);                                                //ê1ÄüÔ¤×°ÔØ       

  TIM_ARRPreloadConfig(TIM3, DISABLE);                                                                                                         //ê1ÄüTIM3ÖØÔØ¼Ä′æÆ÷ARR               
                                /* TIM3 enable counter */
  TIM_Cmd(TIM3, DISABLE);                                                                                                   //ê1Äü¶¨ê±Æ÷3       
       
        TIM_ITConfig(TIM3,TIM_IT_Update, DISABLE);                                                                                //ê1ÄüupdateÖD¶Ï
                               
                               
                               

  /* ÅäÖÃoôÎüμÆóÃμ½μ&#196B0òy½Å */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;                    // ¸′óÃíÆíìêä3ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);
                               
                               
                                GPIO_SetBits(GPIOB, GPIO_Pin_0);
                        }
                        flag=!flag;
                }

        }  
}

/*********************************************END OF FILE**********************/

[/mw_shl_code]

[mw_shl_code=c,true]#include "bsp_breathing.h"

/* LEDáá¶èμè¼¶ PWM±í */
uint8_t indexWave[] = {1,1,2,2,3,4,6,8,10,14,19,25,33,44,59,80,
        107,115,143,160,191,255,255,191,160,143,115,107,80,59,44,33,25,19,14,10,8,6,4,3,2,2,1,1};

/**
  * @brief  ÅäÖÃTIM3¸′óÃêä3&#246WMê±óÃμ½μÄI/O
  * @param  ÎT
  * @retval ÎT
  */
static void TIM3_GPIO_Config(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  /* GPIOB clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);

  /* ÅäÖÃoôÎüμÆóÃμ½μ&#196B0òy½Å */
  GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0 ;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;                    // ¸′óÃíÆíìêä3ö
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

  GPIO_Init(GPIOB, &GPIO_InitStructure);
}


/**
  * @brief  ÅäÖÃǶì×Ïòá¿ÖD¶Ï¿ØÖÆÆ÷NVIC
  * @param  ÎT
  * @retval ÎT
  */
static void NVIC_Config_PWM(void)
{
  NVIC_InitTypeDef NVIC_InitStructure;
  
  /* Configure one bit for preemption priority */
  NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);
  
  /* ÅäÖÃTIM3_IRQÖD¶ÏÎaÖD¶ÏÔ′ */
  NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 2;
  NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  NVIC_Init(&NVIC_InitStructure);
}

/**
  * @brief  ÅäÖÃTIM3êä3öμ&#196WMDÅoÅμÄģ꽣¬èçÖüÆú¡¢¼«DÔ
  * @param  ÎT
  * @retval ÎT
  */

/*
* TIMxCLK/CK_PSC --> TIMxCNT --> TIMx_ARR --> ÖD¶Ï & TIMxCNT ÖØD¼Æêy
*                    TIMx_CCR(μçÆ½·¢éú±ä»ˉ)
*
* DÅoÅÖüÆú=(TIMx_ARR +1 ) * ê±ÖóÖüÆú
*
*/

/*    _______    ______     _____      ____       ___        __         _
* |_|       |__|      |___|     |____|    |_____|   |______|  |_______| |________|
*/
static void TIM3_Mode_Config(void)
{
        TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM_OCInitStructure;                                                                                                                                                               
       
        /* éèÖÃTIM3CLK ê±ÖóÎa72MHZ */
  RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);                                         //ê1ÄüTIM3ê±Öó

  /* »ù±¾¶¨ê±Æ÷ÅäÖà */                 
  TIM_TimeBaseStructure.TIM_Period = 255;                                                                 //μ±¶¨ê±Æ÷′ó0¼Æêyμ½255£¬¼′Îa266′Σ¬Îaò»¸ö¶¨ê±ÖüÆú
  TIM_TimeBaseStructure.TIM_Prescaler = 1999;                                                                    //éèÖÃÔ¤·ÖÆμ£o
  TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1 ;                        //éèÖÃê±Öó·ÖÆμÏμêy£o2»·ÖÆμ(ÕaàïóÃ2»μ½)
  TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;          //ÏòéϼÆêyÄ£ê½
  TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure);

  /* PWMÄ£ê½ÅäÖà */
        TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;                                            //ÅäÖÃÎaPWMÄ£ê½1
  TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;        //ê1Äüêä3ö
  TIM_OCInitStructure.TIM_Pulse = 0;                                                                                                          //éèÖÃ3õê&#188WMÂö3å¿í¶èÎa0       
  TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;            //μ±¶¨ê±Æ÷¼ÆêyÖμD¡óúCCR1_Valê±ÎaμíμçÆ½

  TIM_OC3Init(TIM3, &TIM_OCInitStructure);                                                                                 //ê1Äüí¨μà3
       

  TIM_OC3PreloadConfig(TIM3, TIM_OCPreload_Enable);                                                //ê1ÄüÔ¤×°ÔØ       

  TIM_ARRPreloadConfig(TIM3, ENABLE);                                                                                                         //ê1ÄüTIM3ÖØÔØ¼Ä′æÆ÷ARR

  /* TIM3 enable counter */
  TIM_Cmd(TIM3, ENABLE);                                                                                                   //ê1Äü¶¨ê±Æ÷3       
       
        TIM_ITConfig(TIM3,TIM_IT_Update, ENABLE);                                                                                //ê1ÄüupdateÖD¶Ï
               
        NVIC_Config_PWM();                                                                                                                                                                        //ÅäÖÃÖD¶ÏóÅÏè¼¶               
       
}

/**
  * @brief  TIM3 oôÎüμÆ3õê¼»ˉ
  *         ÅäÖ&#195WMÄ£ê½oíGPIO
  * @param  ÎT
  * @retval ÎT
  */
void TIM3_Breathing_Init(void)
{
        TIM3_GPIO_Config();
        TIM3_Mode_Config();       
}

void Key_GPIO_Config(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
       
        /*¿aÆô°′¼ü¶Ë¿ú£¨PA£©μÄê±Öó*/
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
       
        // IO ¿ú×öêäèë¿úê±£¬2»óÃéèÖÃêä3öÆμÂê
        //GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
       
        GPIO_Init(GPIOA, &GPIO_InitStructure);
}

uint8_t Key_Scan(GPIO_TypeDef* GPIOx,uint16_t GPIO_Pin)
{                       
        /*¼ì2aêÇ·ñóD°′¼ü°′Ï */
        if(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1 )  
        {         
                /*μè′y°′¼üêí·Å */
                while(GPIO_ReadInputDataBit(GPIOx,GPIO_Pin) == 1);   
                return         1;         
        }
        else
                return 0;
}

/*********************************************END OF FILE**********************/
[/mw_shl_code]
中断服务函数
[mw_shl_code=c,true]void TIM3_IRQHandler(void)
{       
       
       
        if (TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET)        //TIM_IT_Update
        {                       
                        period_cnt++;
                        if(period_cnt >= 10)                                                                                //èôêä3öμÄÖüÆúêy′óóú10£¬êä3öÏÂò»ÖÖÂö3å¿íμ&#196WM2¨
                        {
                               
                                TIM3->CCR3 = indexWave[pwm_index];        //¸ù¾YPWM±íDT¸Ä¶¨ê±Æ÷μıè½Ï¼Ä′æÆ÷Öμ
                                pwm_index++;                                                                                                //±êÖ&#190WM±íμÄÏÂò»¸öÔaËØ
                       
                                if( pwm_index >=  44)                                                                //è&#244WMÂö3å±íòѾ-êä3öíê3éò»±é£¬ÖØÖÃPWM2é±í±êÖ¾
                                {
                                        pwm_index=0;                                                               
                                }
                               
                                period_cnt=0;                                                                                                //ÖØÖÃÖüÆú¼Æêy±êÖ¾
                }
                TIM_ClearITPendingBit (TIM3, TIM_IT_Update);        //±ØDëòaÇå3yÖD¶Ï±ê־λ
        }
}[/mw_shl_code]

最佳答案

查看完整内容[请看2#楼]

关闭的时候将占空比设置为0就可以了,也就是你的TIM3->CCR3,并且将对应的数组下标pwm_index 设置为0
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

19

主题

246

帖子

0

精华

高级会员

Rank: 4

积分
608
金钱
608
注册时间
2017-9-21
在线时间
171 小时
发表于 2018-6-8 11:11:38 | 显示全部楼层
本帖最后由 哆啦A萌 于 2018-6-8 14:33 编辑

关闭的时候将占空比设置为0就可以了,也就是你的TIM3->CCR3,并且将对应的数组下标pwm_index 设置为0
回复

使用道具 举报

1

主题

2

帖子

0

精华

新手入门

积分
4
金钱
4
注册时间
2018-6-8
在线时间
0 小时
 楼主| 发表于 2018-6-8 14:54:14 | 显示全部楼层
哆啦A萌 发表于 2018-6-8 14:31
关闭的时候将占空比设置为0就可以了,也就是你的TIM3->CCR3,并且将对应的数组下标pwm_index 设置为0

其实我弄好了。应该是全局变量声明那里有点问题,改pwm_index没该成功,后来改了声明后就OK了
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-5-29 06:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表