在使用STM8的PWM功能时,一般都是改变占空比来改变输出电压大小。但是有时候不需要改变PWM的占空比,而是需要按照一定的规律改变输出PWM的频率,而占空比保持不变。现在总结一下如何实现STM8单片机输出PWM波时动态改变频率。

直接看C代码的实现

#include "pwm.h"
u16  FRE = 100;             //frequency  频率 4M / 100 = 40K
void PWM_GPIO_Init( void )
{PC_DDR |= ( 1 << 7 );       //PC7 推挽输出PC_CR1 |= ( 1 << 7 );
}
void TIM1_Init( void )
{PWM_GPIO_Init();TIM1_CR1 = (1<<7);                        //自动预装载允许TIM1_CCMR2 = (6<<4)|(1<<3)|(1<<2);        //TIM1 CH2 PWM1  输出比较1预装载使能  输出比较1 快速使能TIM1_CCER1 |= 0x10;                       //CC2为输出 高电平有效    TIM1_PSCRH = 0x00;                        //预分频 0 TIM1_PSCRL = 0x03;                        //16M/(1+3)=4 MTIM1_ARRH = FRE >> 8;                     //设定自动重装载值高8位TIM1_ARRL = FRE;                          //设置自动重装载值低8位TIM1_BKR = 0x80;                            //刹车寄存器 使能OC1输出 定时器不工作时输出无效电平TIM1_EGR = (1<<0);                        //产生更新事件TIM1_CR1 |= 0x01;                           //使能计数器
}
//TIM1 CH2  PC7
void TIM1_CH2_FRE_DC_Change( unsigned int freq, unsigned int dc )
{TIM1_ARRH = freq >> 8;                     //设置频率TIM1_ARRL = freq;TIM1_CCR2H = dc >> 8;TIM1_CCR2L = dc;
}

首先初始化PWM口,这里使用的是定时器1通道2,也就是PC7口,下来初始化定时器,将定时器1通道2设置为PWM功能,这里记住一定要开启自动预装载功能,不开起预装载功能,直接改变ARR寄存器的值时,输出的频率也能发生改变,但是输出的PWM波形有时候会出现丢失现象,也就是会有一段时间无波形输出,开启自动预装载功能后,放入ARR寄存器的值不会立即发生改变,而是在更新ARR的值时才发生改变,这样在变频时就能保证输出的每个周期波形都是完整的,不会出现输出PWM波形丢失现象。

初始化完定定时器后,将频率和占空比的设置单独封装一个函数,这样需要变频的时候,直接调用这个函数就行。

定时器的时钟设置为4MHz,ARR寄存器的值设置为100时,输出频率为4M/100=40KHz,当ARR寄存器的值设置为1000时,输出频率为4MHz/1000=4KHz,这样当ARR的值在100到1000之间连续变化时,输出的PWM频率就会在40K到4K之间连续变化。

主程序代码如下

#include "iostm8s103F3.h"
#include "led.h"
#include "pwm.h"void SysClkInit( void )
{CLK_SWR = 0xe1;       //HSI为主时钟源  16MHz CPU时钟频率CLK_CKDIVR = 0x00;    //CPU时钟0分频,系统时钟0分频
}void main( void )
{unsigned int i = 0;SysClkInit();__asm( "sim" );TIM1_Init();__asm( "rim" );while( 1 ){for( i = 100; i < 1000; i++ ){TIM1_CH2_FRE_DC_Change( i, i / 2 );            }}
}

主程序的主要功能就是循环调用TIM1_CH2_FRE_DC_Change()函数来改变频率和占空比,在本例程中将占空比的值设置为频率的一半,这样在任何频率下占空比都是50%。ARR寄存器值设置为100到1000循环变化,这样输出的PWM频率就会在40K到4K之间循环变化。

输出PWM波形如下:

可以看到输出一个脉冲之后频率改变了一次,而占空比没有发生变化。

STM8学习笔记---PWM变频输出相关推荐

  1. STM8学习笔记---PWM互补波形输出

    脉宽调制(PWM,Pulse Width Modulation)是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术,广泛应用在从测量.通信到功率控制与变换的许多领域中. 常见的用法是输出 ...

  2. STM8学习笔记----PWM单脉冲模式输出

    先看看官方资料对单脉冲模式的介绍 下面看C代码的实现 void PWM_GPIO_Init( void ) {PC_DDR_DDR6 = 1; //输出管脚 PC6 TIM1_CH1PC_CR1_C1 ...

  3. STM8学习笔记----普通IO口模拟串口功能

    串口在产品应用中很常见,但是单片机的默认带的串口往往比较少,有时候就会出现串口不够用,所以就想着能不能用普通IO口模拟串口来实现串口的功能. 要模拟串口首先要清楚串口数据传输过程中的原理. 常用的串口 ...

  4. Polyworks脚本开发学习笔记(十二)-输出和读取文本文件

    Polyworks脚本开发学习笔记(十二)-输出和读取文本文件 Polyworks作为一个测量工具,将测量的数据方便的导出到文本文件则是一项必须的功能.在DATA_FILE这个命令下提供了很多子命令用 ...

  5. tornado学习笔记day03-响应输出

    write: 作用: 将chunk中的数据写到输出缓冲区 利用write方法写json数据 我们自己手动序列化json的那种方式Content-Type 的属性值为text-html 而我们采用wri ...

  6. STM8学习笔记---利用PWM功能输出SPWM波

    要生成SPWM波,其关键是要生成一组正弦规律变化的数字,然后将数字对应成PWM输出的占空比,按照顺序输出占空比就行.生成正弦波的方法在 使用C语言产生正弦波数据 这篇博客有详细说明,这里就不说了. 本 ...

  7. STM8学习笔记---定时器输出7路PWM波

    STM8S003F3P6单片机共有三个定时器定时器1.定时器2.定时器4.其中定时器1为16位高级定时器,定时器2为16位通用定时器,定时器4为8位基本定时器.定时器1和定时器2可以输出PWM波.其中 ...

  8. STM32学习笔记—PWM输出

    1.pwm输出介绍 2.函数配置 3.源码 1.pwm输出介绍 脉冲调制(pwm),其根本原理就是通过控制占空比来控制输出.STM32的定时器除了TIM6和7之外都可以产生pwm输出,其中高级定时器1 ...

  9. STM8学习笔记---寄存器操作之位或和位与运算

    刚开始学习STM8单片机时,看别人的代码,在设置寄存器的时候经常使用,位或.位与.左移.右移等运算,就很不理解,为什么不直接给寄存器赋值,非要搞的这么复杂.直到后来程序写的多了,才明白这样写的好处.比 ...

最新文章

  1. [BZOJ2095]Bridges
  2. JAVA——改变观感
  3. 【Linux】一步一步学Linux——rename命令(36)
  4. 这两天学习nRF51822的心得
  5. Linux内核设计与实现 总结笔记(第五章)系统调用
  6. spring入门到放弃——spring事务管理
  7. WPF——自动关闭无模式窗口
  8. Xen 安装ubuntu xen DomU
  9. mysql hyperloglog_Redis HyperLogLog
  10. unix编程实训教程之 more(觉醒篇一 Begin)
  11. 【硬件测评】电脑测评工具箱及方法汇总
  12. 华为解锁密码忘了怎么办用计算机,华为笔记本忘记密码怎么办(免费教你3种解密方法)...
  13. 三菱FX系列PLC教学课程---一个从基础讲起的电梯控制实例
  14. VB制作网页自动填表
  15. 请说说CommonJS和ES module的区别
  16. 安全帽识别系统的应用鹰眸视频分析
  17. qgis获取几何图形中心点
  18. 磁盘检查清理修复命令
  19. RK3228H开发之3328芯片手册简单分析
  20. c语言数组编程题及解答,C语言数组编程题及解答

热门文章

  1. H3C vrrp *** ipsec 基本配置
  2. 不是我的错,也不是Atlas的!
  3. 本周ASP.NET英文技术文章推荐[03/04 - 03/10]
  4. 在ASP.NET中实现AJAX
  5. Docker Weave 介绍 or 工作原理
  6. Python入门-散点图绘制
  7. TZOJ 2999 Network(连通图割点数量)
  8. js 改变this指向的几种方法(个人学习笔记)
  9. JDK安装、java环境配置
  10. 51nod--1212 最小生成树