嵌入式 > 技术百科 > 详情

STM8S的按键PWM调光灯历程

发布时间:2020-12-25 发布时间:
|

STM8SPWM应用


前几天有个项目用到PWM,今天整理下,弄个氛围灯;记录下,以后忘记了返回来还能看看。


思路就是在硬件端设置个按键,按下全局变量Key_num的值+1,按键一开始我用轮询法做的,后来觉得轮询法延时可能导致未知的问题,现在用中断法做;根据Key_num的值,用switch语句选择要变换的模样。 

上代码:


/*****************************************************************************

  * @function  : Tim2_Init

  * @brief     : TIM2初始化函数 CH1用作出LED——G的呼吸变化灯

  * @note      : STM8S005

  * @param     : null

  * @retval    : null

  * @author    : 2016.03.23 by Steam.Yang 

                2016.11.02  RPP 学习并增加注释

******************************************************************************/

void Tim2_Init(void)                    //TIM2的初始化语句们

{

    //配置通道1

        TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999);              //第一步配置时基单元,先设置预分频PSCRH/L高低八位 寄存器,再设置自动装载寄存器ARRH/L。

    TIM2_OC1Init(TIM2_OCMODE_PWM1,

                     TIM2_OUTPUTSTATE_ENABLE,

                     0, 

                     TIM2_OCPOLARITY_LOW);                      //然后配置通道的输出模式为PWM,启用输出比较,占空比设置为0,输出为低电平

    TIM2_OC1PreloadConfig(ENABLE);

        TIM2_Cmd(ENABLE); 



    //配置通道2

        TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999);              //第一步配置时基单元,先设置预分频PSCRH/L高低八位 寄存器,再设置自动装载寄存器ARRH/L。

        TIM2_OC2Init(TIM2_OCMODE_PWM1,

                     TIM2_OUTPUTSTATE_ENABLE,

                     0, 

                     TIM2_OCPOLARITY_LOW);                      //然后配置通道的输出模式为PWM,启用输出比较,占空比设置为0,输出为(低电平).105s4是低电平点亮

        TIM2_OC2PreloadConfig(ENABLE);                          //开启预装载寄存器

        TIM2_Cmd(ENABLE);                                       //最后的开启  启用定时器




        //配置通道3

            TIM2_TimeBaseInit(TIM2_PRESCALER_8, 999);            //第一步配置时基单元,先设置预分频PSCRH/L高低八位 寄存器,再设置自动装载寄存器ARRH/L。

    TIM2_OC3Init(TIM2_OCMODE_PWM1,

                     TIM2_OUTPUTSTATE_ENABLE,

                     0, 

                     TIM2_OCPOLARITY_LOW);                      //然后配置通道的输出模式为PWM,启用输出比较,占空比设置为0,输出为低电平

    TIM2_OC3PreloadConfig(ENABLE);

    TIM2_Cmd(ENABLE); 




}


这段代码为PWM初始化代码,被折腾了好几天,手头上的105S4跟别人就是不一样,他非要低电平点亮小灯。。。。,心累这段代码比较重要。


下面的是主函数


int main( void )

{



        CLK_HSICmd(ENABLE);     //配置个时钟先

        GPIO_Init(GPIOC, GPIO_PIN_7, GPIO_MODE_IN_PU_NO_IT);//初始化按键的GPIO口 上拉输入

        Tim2_Init();                        //再初始化TIM2 PWM1输出模式




    while(1)

    {


    Key_Press();                        //再调用按键


                                    //再给PWM呼吸灯占空比的值

        if((!sta) && (PWM<1000))    //比较好的循环


                {

                        PWM++;

            if(PWM == 1000) sta = 1;


        }

                if((sta) && (PWM>0))

                {

                  PWM--;

                  if(PWM == 0) sta = 0;

                }


        Delay_Us(500);               //延时调整呼吸的速度


                switch(Key_num){


                case 0:                         //没有按下 或者按到第7下时 全灭,进行清零

                TIM2_SetCompare1(0);

                TIM2_SetCompare2(0);

                TIM2_SetCompare3(0);


                break;



                case 1:

                    TIM2_SetCompare1(1000);     //按第一下,计数1, W灯常亮1 (1000常亮 PWM呼吸  0关闭)

                                break;

                case 2:                         //按第二下,计数2,W灯呼吸2

                    //TIM2_Cmd(DISABLE);//本来想关掉PWM来进行关闭灯亮,结果不能关,关了后面就不执行了 要重新做初始化  要做其他处理

                    TIM2_SetCompare1(PWM);

                                break;

                case 3:

                    TIM2_SetCompare1(0);

                    TIM2_SetCompare2(1000);     //按三下,计数3,G灯常亮 ,同时要关掉前面亮着的

                break;


                 case 4:                        //按四下,计数4,G灯呼吸 

                    TIM2_SetCompare2(PWM);      //

                break;


                case 5: 

                    TIM2_SetCompare2(0);        //按第五下,计数5,B灯常亮 

                    TIM2_SetCompare3(1000);     //

                break;


                case 6:                         //按第六下,计数6,B灯呼吸 

                    TIM2_SetCompare3(PWM);      //

                break;


                case 7:                         //全呼吸

                    TIM2_SetCompare1(PWM);


                    TIM2_SetCompare2(PWM);

        `

                TIM2_SetCompare3(PWM);


                }


    }


}


PWM不能关 关了就要重新初始化,所以选变成0 他就不亮了。这个循环结构是非常好的循环结构,很多书上的循环结构都是从0-100 没有100-0 灯呼吸很突兀,所以建议用这种。 

中断的按键函数 

放在中断里面


if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0)

    {

        delay_us(5000);     //去抖延时

        if(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0)

        {

while(


『本文转载自网络,版权归原作者所有,如有侵权请联系删除』

热门文章 更多
ZigBee技术语音图像无线监控系统的设计与实现