在使用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. hdu-1108 最小公倍数
  2. CVPR 2021 | Involution:超越 Convolution 和 Self-attention 的神经网络新算子
  3. android adm查看进程,基于android studio 的ADM对卡顿,耗时方法的检测
  4. js文件中加载其他js文件
  5. HDU2227(非降子序列的个数)
  6. LeetCode 1245. 树的直径(图的最大直径结论)
  7. 最新!北京电影学院成立“翟天临事件”调查组
  8. Thread源码-----传实现了Runnable接口的类的实例给Thread的作用
  9. 第一次知识补充及用户登录(三次机会重试)作业
  10. java如何生成随机数
  11. WIN7安装IIS后无默认网站(Default Web site)解决方案
  12. C语言打印数据的二进制格式-原理解析与编程实现
  13. python如何打印26个字母_python3打印26个英文字母
  14. Deep Learning Chapter02:Python基础语法回顾
  15. Cisco RV320未经身份验证的配置导出
  16. 大数据学习路线思维导图
  17. WebRTC Native M96音频基础知识介绍--使用Opus
  18. Debian11安装mysql5.7
  19. 根文件系统制作 -- Kernel panic - not syncing
  20. Mybatis学习(狂神)

热门文章

  1. 创建sdcard.img时,提示permission dennid
  2. 欣赏下国外人css3打造的载入动画
  3. python中使用C类型的数组
  4. Android打开App2SD
  5. 利用递归遍历文件夹和文件存入TreeView
  6. DEVO 7E遥控器配对
  7. sqlserver object_id()函数
  8. 不用也要知道的几种算法(PHP版本)
  9. PixelFormat 枚举
  10. android 之 TabHost