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调光灯历程相关推荐

  1. 基于单片机的智能电子密码锁系统设计-基于51单片机酒精浓度检测仪设计-基于单片机的水缸加热温控控制系统设计-基于单片机蓝牙技术的温室监测系统设计-基于单片机智能PWM调光灯系统设计【毕设方案】

    600基于单片机的智能电子密码锁系统设计-电路程序资料 本设计采用的是AT89C51单片机作为控制核心,控制外围电路工作的装置.在本次基于单片机的电子密码锁设计中,将采用AT89C51单片机作为控制核 ...

  2. linux pwm控制蜂鸣器 滴滴_兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证

    兴安盟KOBISHI电磁蜂鸣器BZ-21BLAC24V保证日本KOBISHI蜂鸣器.jjb器 .蜂鸣器BZ-35VR DC24V.济南千斗工业出售,货期短.价格低.保证 这里只对必须用1/2duty的 ...

  3. 基于单片机的智能台灯系统设计(#0421)

    随着时代发展,节能环保.健康与人们的日常生活变得密不可分,科技的进步,也使家电更加智能化和人性化.台灯作为家电中基础的,也是必不可少的,所以,提出PWM调光灯设计. 功能描述 1.采用51单片机作为主 ...

  4. LED音乐频谱之输出数据处理

    转载请注明出处:http://blog.csdn.net/ruoyunliufeng/article/details/38023539 一.PWM调节 1.初始化 void DACInit() {CC ...

  5. Windows on Device 项目实践 4 - 智能风扇制作

    在前面的文章中,我们已经学习并且利用Intel Galileo开发板和Windows on Device制作了火焰报警器.感光灯和PWM调光灯.在这个项目中,我们来利用温度传感器和直流电机,完成一个简 ...

  6. 【Arduino】Arduino UNO入门

    一.LED闪烁 void setup() {// initialize digital pin LED_BUILTIN as an output.pinMode(LED_BUILTIN, OUTPUT ...

  7. c语言求某年某月1日是星期几,蔡勒(Zeller)公式:根据日期推算是星期几

    Zeller's Congruence: w=y + [y/4] + [c/4] - 2c + [26(m+1)/10] + d - 1 公式中的符号含义如下: w:星期: w对7取模得:0-星期日, ...

  8. 《Windows IoT 应用开发指南》

    物物互联的时代已经到来,智能家居.智慧校园.智慧交通.可穿戴.无人机.全息投影,各种各样的新名词.黑科技层出不穷.当我们为五年前能够通过手机控制家电而欣喜若狂的时候,可曾憧憬过当前使用增强现实设备完成 ...

  9. 51单片机 小车 L298N pwm调速 串口控制 按键控制

    难点:1.串口定时器T1,和T0定时器优先级 2.pwm频率与占空比的设置 按键控制 按键1--前进 按键2--后退 按键3--加速 按键4--减速 (板子上只有四个按键) 串口控制 '1'--前进 ...

  10. pwm调速流程图小车_51单片机智能小车《pwm调速按键控制小车动作》

    //P1.0-P1.7分别对应小车1N1-1N8. #include           //头文件 #define uint unsigned int  //宏定义 #define uchar un ...

最新文章

  1. linux zip指定目录解压,Linux zip解压/压缩并指定目录
  2. tilemap 导入unity_教程|Unity中使用Tilemap快速创建2D游戏世界
  3. gitlab+jenkins 搭建
  4. svn: E200033: database is locked, executing statement 'RELEASE   s0' 问题解决办法
  5. 批处理结束某个进程_进程调度
  6. Matlab网格划分
  7. 画图软件Microsoft visio下载安装及使用
  8. 无线网破解 跑字典 EWSA使用教程
  9. 前端开发工程师,CSS盒子模型居中方法
  10. 在idea中一键部署项目到Docker及CA认证
  11. linux oel7没有网络,OEL7.2下Oracle11.2.0.4RAC部署
  12. 【计算机网络四】网络层
  13. 开发指南专题六:JEECG微云快速开发平台代码生成
  14. word中图片不显示怎么办
  15. STM32 串口的使用
  16. python分段函数输入x的值求y的值_C语言编程题 有一分段函数如下,要求用scanf函数输入整数x的值,求y值并在屏幕上输出。有分段函数如下,编程实现输入整...
  17. 九马画山数命运, 一身伴君不羡仙! 与代码不离不弃!
  18. Java小数点数字和百分号数字之间的转换
  19. 无忧无盘服务器内存,无忧无盘安装以及配置教材.doc
  20. backtrader量化回测,基础篇,附MACD交易回测代码

热门文章

  1. 【BZOJ3162】独钓寒江雪 树同构+DP
  2. NodeJS 服务 Docker 镜像极致优化指北
  3. QIODevice::write : device not open
  4. 【软开云】基于华为软开云用敏捷思想管理项目团队一点思路(2)
  5. linux下无线网卡做热点,用ArchLinux做wifi热点无线路由
  6. 2021清北学堂储备营Day1
  7. 富爸爸穷爸爸的所有书籍
  8. C++用户的Cplex使用指南(三)——Cutting stock problem求解
  9. OceanBase 社区版 3.1.3 Docker镜像尝鲜,能错过?不存在的
  10. Linux下最好用的中文输入法 scim