STM8S的按键PWM调光灯历程

发布者:Serendipity22最新更新时间:2020-02-07 来源: eefocus关键字: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);//设置捕获比较寄存器的值

关键字:STM8S  按键PWM  调光灯 引用地址:STM8S的按键PWM调光灯历程

上一篇:STM8S之STVD问题解决47 can't openfile crtsi0.sm8
下一篇:STM8S使用外部时钟引起串口数据传输错误

推荐阅读最新更新时间:2024-11-11 07:34

STM8S Timer2_OC1_PWM1输出模式
C语言: Codee#11722 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 实验平台: STM8S103F2P6 FM 接收实验核心板 + 硬件 : STM8S103F2P6 + 开发平台: IAR For STM8 1.10 + 仿真器 : ST-Link + 日期 : 2010-6-22 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include stm8s.h /******
[单片机]
STM8S学习笔记之三(STM8 SysClk)
STM8S系统时钟设置,对于单片机来说是非常重要的,不同的用处必须应用不同的时钟。。举个例子,做AVR时在高稳定的串口通讯时用的时钟一般是3.6864M,主要是这个算波特率精确。。STM8S同样重要。。 STM8S时钟源: ●1-24MHz高速外部晶体振荡器(HSE) ●最大24MHz高速外部时钟信号(HSE user-ext) ●16MHz高速内部RC振荡器(HSI) ●128KHz低速内部RC(LSI) 各个时钟源可单独打开或关闭,从而优化功耗。 对于我这么懒得人一般都是用的内部或者外部晶振。。这个芯片时钟方面很大的一个亮点就是时钟可以自由分频。在降低功耗方面,如果有特殊
[单片机]
stm8S毫秒定时器
#include tim4.h #include stm8s_tim4.h #define TIM4_PERIOD 124 void Dely1ms(void) { TIM4_DeInit(); /* Time base configuration */ // 8M/64=125000HZ // (x + 1)/125000=0.001s = 1ms // x = 124 TIM4_TimeBaseInit(TIM4_PRESCALER_64, TIM4_PERIOD); /* Clear TIM4 update flag */ TIM4_ClearFlag(TIM4_FLAG_UPDATE); /* Enable update
[单片机]
STM8S关于TIM最高频率设置的坑
前言:STM8S003配置TIM4频率设置在100kHz,即10us中断一次 问题:想要配置100k,但是顶死了60k,这么配置都上不去! 疑惑:库函数和寄存器到底有多大差别? 正文: 1 配置TIM4基本定时器(计数器只有256个) // TIM4_DeInit(); TIM4_TimeBaseInit(TIM4_PRESCALER_16,9 ); //10us 16M/16/(9+1)=100kHz // TIM4_ClearFlag(TIM4_FLAG_UPDATE); //清除标志位 TIM4_ITConfig(TIM4_IT_UPDATE, ENABLE); //使能更新UPDATE中断
[单片机]
stm8s使用问题总结1——segment .text size overflow
这几天在使用stm8s003MCU进行嵌入式开发,之前没用过stm8系列的MCU,在使用过程中不免遇到很多问题,本文讲述的即是开发过程中一个问题。在使用stm8s003编程过程中,使用了官方的库文件,在进行build时候,报了一个error:segment .text size overflow。经过查阅资料才发现之所以出现本错误是因为代码长度超过了MCU的flash。因为stm8s003的flash为8KB,而我的代码长度超过了8KB。实际上,在使用官方库进行编程时,官方库中好多代码实际上没有用到,所以可以将这些库中未使用到的代码函数不编译进自己写的代码。具体操作如下: 第一步,打开stvd软件,点击Project下的Set
[单片机]
<font color='red'>stm8s</font>使用问题总结1——segment .text size overflow
stm8s_iwdg(独立看门狗)
//内部时钟源128Khz,硬件2分频=64khz 这里写代码片 IWDG_Initializes(); //初始化 IWDG_ReloadCounter(); //喂狗(重载计数值) 初始化流程: void IWDG_Initializes(void) { IWDG_Enable(); //使能看门狗 IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable); //允许写分频值和重载值 IWDG_SetPrescaler(IWDG_Prescaler_256); //分频值 IWDG_SetReload(250);
[单片机]
STM8S EEPROM 读写字节操作
C语言: Codee#11824 /*++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ + 实验平台: STM8S103F2P6 FM 接收实验核心板 + 硬件 : STM8S103F2P6 + 开发平台: IAR For STM8 1.10 + 仿真器 : ST-Link + 日期 : 2010-6-29 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++*/ #include stm8s.h unsign
[单片机]
<font color='red'>STM8S</font> EEPROM 读写字节操作
关于STM8S单片机低功耗应用中时钟源切换时的注意点
简介:一般正常运行时,我们使用的时HSE(外部高速时钟源),当准备进入低功耗时,我们会切换到内部高速时钟HSI(一般需要分频以降低功耗),关闭HSE(若不关闭就不会出现下面的问题,即不用看本文了)。当从低功耗退出,进入正常运行时,会切换HSE。 这时由于之前关闭了HSE,再次打开HSE时会需要一段时间才会ready,然后再由HSI切换到HSE。 //该函数可实现切换时钟源功能。HSE与HSI互切。 void Switch_SysClock(CLK_Source_TypeDef CLK_NewClock) { switch(CLK_NewClock) { case CLK_SOURCE_HSE: //启用
[单片机]
小广播
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved