STM8S的按键PWM调光灯历程

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(GPIO_ReadInputPin(GPIOC, GPIO_PIN_7) == 0);
            Key_num++;
            if(Key_num == 2)
            {
                Key_num=0;

            }
        }
    }

写完了,有什么再补充吧,
吐槽这鬼编译器,恶心 好几次都代码上不去

补充:
我师父教我的 哈哈
首先该计数器,循环技术,例如从0到ARR,那么这个ARR就决定了PWM的周期,
PWM周期=(ARR+1)*计数器时钟的周期.
PWM频率=计数器时钟的频率/(ARR+1)
在计数器模块中还有一个比较器,比较器有两个输入,一个是计数器的当前值,另一个是可以设置的数,这个数来着一个比较寄存器.当计数器的值小于比较寄存器的值时,输出为1(也可以是0),当计数器的值大于或者等于比较器寄存器的值时,输出为0(也可以是1,与前面对应).

STM8–PWM初始化流程
1、时基初始化,得出PWM的频率(周期)
2、初始化输出比较通道,确定是哪个模式、通道、脉冲宽度(确定占空比)、和电平。
3、输出比较通预装载使能
4、允许主输出(TIM1)
5、使能定时器

随时改变PWM频率:
void TIM1_SetAutoreload(uint16_t Autoreload);//设置自动重装寄存器的值
随时改变占空比:
TIM1_SetCompare1(0x0000);//设置捕获比较寄存器的值

  • 8
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: STM32按键PWM光是通过STM32单片机实现的一种光控制方式。该方案可以实现通过按键PWM波的占空比,从而实现LED灯的亮度节。 具体实现方法如下:首先,需要将按键连接到STM32单片机的GPIO口。当按键按下时,通过读取GPIO的电平状态来触发中断,表示按键按下的事件发生。接下来,在中断服务函数中,使用软件定时器或硬件定时器来生成PWM信号。可以使用STM32的定时器模块来实现。 为了实现光效果,可以PWM波的占空比。占空比是指PWM信号中高电平的时间占总周期的比例。通过改变占空比的大小,可以控制LED灯的亮度。可以使用定时器的PWM模式来生成PWM信号,并通过修改CCR寄存器的值来改变占空比。此外,还可以设置适当的频率,以满足LED灯光的需求。 通过编写相应的软件程序,可以实现按键控制的PWM光功能。当按键被按下时,触发中断,中断服务函数改变PWM波的占空比,并更新CCR寄存器的值。由于中断服务函数在按下事件的短时间内执行,因此PWM波的变化会非常快速。这样,LED灯的亮度也会实时变化。 总结来说,STM32按键PWM光是一种通过STM32单片机实现的LED灯控制方式。利用定时器模块生成PWM信号,通过改变占空比来实现LED灯亮度的节。按键的中断事件触发后,改变PWM波的占空比并实时更新CCR寄存器的值,从而实现LED灯的实时光功能。 ### 回答2: STM32按键PWM光是一种通过按键控制STM32的PWM输出来实现灯光光功能的方法。在使用STM32进行按键PWM光时,需要进行以下步骤: 首先,需要选定一个适当的PWM通道和引脚作为输出通道。在STM32中,有多个PWM通道可供选择,可以根据具体需求选择合适的通道和引脚。 然后,需要初始化相应的GPIO端口为输入模式,用于连接按键。同时,也需要初始化PWM模块,设置相应的频率和占空比。 接下来,需要设置一个中断用于检测按键的状态变化。当按键按下或释放时,中断会被触发,通过检测中断状态可以判断按键的状态。 在主程序中,可以通过读取按键的状态来进行相应的PWM光操作。例如,当按键按下时,可以逐渐增加PWM占空比,实现灯光逐渐亮起的效果;当按键释放时,可以逐渐减小PWM占空比,实现灯光逐渐变暗的效果。 需要注意的是,在进行PWM光时,需要合理选择PWM频率和占空比,以避免闪烁或视觉疲劳的问题。同时,还需要考虑到按键的按下和释放速度,以确保灯光的光过程流畅且响应灵敏。 总的来说,使用STM32进行按键PWM光功能可以通过初始化GPIOPWM模块,设置中断用于检测按键状态,并根据按键状态进行相应的PWM光操作来实现。这种方法简单且有效,可应用于各种需要光功能的场景。 ### 回答3: STM32按键PWM光是一种通过按键控制STM32微控制器的PWM输出来实现灯光亮度节的技术。通过这种技术,我们可以通过按键来实现对灯光的暗和亮。 具体实现的步骤如下:首先,我们需要连接一个可光的LED灯到STM32的PWM输出引脚上。然后,通过编程设置PWM输出引脚作为输出模式,并初始化PWM定时器。 接下来,我们需要编写代码来实现按键的检测和响应。通过配置GPIO引脚作为输入模式,我们可以在程序中读取按键的状态。当按键被按下时,可以通过判断按键的状态来改变PWM输出的占空比,从而节灯光的亮度。 在编程中,我们需要使用按键的中断功能,以便及时响应按键的状态变化。当按键被按下时,中断会被触发,程序会相应地PWM输出的占空比。 通过这种方法,我们可以通过按下按键来实现灯光的暗和亮,而不需要使用旋钮或者其他外部设备。这种方法简单方便,适用于各种需要光功能的场合。 总结起来,STM32按键PWM光通过按键控制PWM输出来实现对灯光亮度的节。它可以简化光系统的设计,提供便捷的灯光节方式。同时,通过使用中断来响应按键动作,这种方法也具有较高的实时性和响应性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值