STM8S的按键PWM调光灯历程

发布者:EtherealLight最新更新时间:2020-01-29 来源: 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调光灯历程

上一篇:stm8 TIM2 PWM配置
下一篇:STM8S系列单片机TIM1的PWM配置与TIM2的区别

推荐阅读最新更新时间:2024-11-10 11:27

STM32掌机教程3,工程模板与带按键测试
我们需要“脚手架”   关于代码,我想体现出这么一个过程:我是如何一步一步修改代码的。我认为,从学习的角度来考虑,直接看最终的代码没有什么意义。 写代码就像工人盖房子,盖房子过程中,工人要搭建脚手架;房子盖好以后,脚手架要拆除。直接领着学生看盖好的房子,说,你就照着这个样子来盖房子,学生是做不出来。他不知道怎么搭建脚手架,甚至都不知道什么是脚手架。 所以我打算这个系列的讲义,每一篇代码都在上一篇的基础上做一些改进,保留代码“进化”的过程。有些过程代码在最终的代码中不会体现,但是也很重要,就像房子盖好以后,你看不到脚手架一样。我们需要脚手架。   目前用到的代码先用压缩包的形式上传,等教程写完以后,后续代码的维护使用Git。
[单片机]
STM32掌机教程3,工程模板与带<font color='red'>灯</font><font color='red'>按键</font>测试
STM8S之时钟切换自学笔记2
上一次是自动切换,这次写下手动切换 主要寄存器 CLK_SWCR CLK_SWR CLK_CMSR 手动切换 1、CLK_SWR写入u8值,CLK_SWCR中 SWBSY硬件置位 2、用户软件等待至目标时钟稳定,CLK_SWCR SWIF含义取决于SWEN位的状态,目标时钟源是否稳定,如果SWIEN为1,则产生一个中断 3、在用户软件所选时间点、设置CLK_SWCR中的SWEN,执行切换 #include stm8s.h #define uint unsigned int void Delay(uint x) { while(x--); } void main() { // u8 i; GPIO_Init( GPIOG
[单片机]
单片机学习之十二:按键控制跑马灯(中断)
一、实验现象: 二极管作左右跑马灯,当按下外部按键K0时,8个二极管全部闪烁5次后从K0按下之前的位置继续作跑马灯。 二、实验目的 掌握堆栈在中断程序中的作用 掌握让程序保护现场的方法 三、实验任务分析: 有了以前各个试验的经验,相信这个试验对我们来说,难度不是很大。我们唯一接触到的新的知识点是:让程序从返回中断之前的位置继续执行跑马灯,那么如何能够让程序在进入中断之前记住当时所处的位置,在执行中断之后,能够返回这个地方继续往下执行呢? 我们可以这样作:在进入中断之前,把该时刻的程序信息放到一个地方保存下来,在返回中断之前,再到这个地方把我们存放的程序信息取出来。这样不就可以从进入中
[单片机]
单片机学习之十二:<font color='red'>按键</font>控制跑马灯(中断)
按键数码管数值前移
#include reg51.h typedef unsigned char uchar; typedef unsigned int uint; void delay(unsigned int i); //函数声名 char DelayCNT;//定义变量 sbit P10=P1^0; uint Count=0; uchar n=0; uchar Key_Value;//获取键盘码 uint i=0; uint flag=0; //此表为 LED 的字模, 共阴数码管 0-f unsigned char code Disp_Tab = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
[单片机]
STC15F104W单片机四路按键循环开关程序
用一个按键控制四个继电器循环导通,程序由51单片机的程序改到STC15F104W上,第一次按键,第一个继电器吸合,第二次按键,第二个继电器吸合,第一个继电器释放,以此类推。最初的想法就是实现电风扇,三档开关,程序里面可以修改端口。 #include reg52.h sbit key = P3^4; //定义按键 void delayms(void); //延时 void led_refresh(unsigned char i); //led显示 unsigned char keyscan(void); //按键 void init(void); /
[单片机]
IO口做输入(按键控制想要的亮(共四个))
#include msp430x16x.h void main() { WDTCTL = WDTPW + WDTHOLD;//关看门狗 unsigned int i=60000; P1DIR &= ~BIT5;//输入 P4DIR |= BIT0; P4OUT |= BIT0; while(1) { if((P1IN&BIT5)==0)//二键按下 { while(i--); i=60000; if((P1IN&BIT5)==0) { while(P1IN&BIT5==0); P4OUT ^=BIT0
[单片机]
51单片机实验7:矩阵按键
开发板矩阵按键模块电路图如下: 开发板数码管模块电路图如下: 矩阵按键扫描原理: 方法一:逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。 方法二:行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。 在本程序中,扫描矩阵按键采用行列扫描的方式!
[单片机]
51单片机实验7:矩阵<font color='red'>按键</font>
单片机按键检测函数
/******************************************************************* 函数功能:判断某一按键的状态; 返回值:0x00-未按键,0x01-短按键,0x02-长按键;(本程序不设连发功能) 注意:本长短按键是在同一按键上实现; 长按键是持续按下2秒后认为是长按键,此时可以执行按键功能程序,必须释放 按键后才可以再次执行按键判断; 短按键是按下时间在2秒以内并释放的为短按键,含20ms的防抖,按键执行是在 按键释放后执行的; 为了定时方便,本函数是每10ms执行一次的,如果执行周期有变,注意更改相 关变量。 (可以将此函数以结构体形式扩展为多个通道检
[单片机]
小广播
设计资源 培训 开发板 精华推荐

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

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

换一换 更多 相关热搜器件

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

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