历史上的今天
今天是:2024年09月22日(星期日)
2021年09月22日 | STM8学习笔记---PWM变频输出
2021-09-22 来源:eefocus
在使用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 M
TIM1_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波形如下:

可以看到输出一个脉冲之后频率改变了一次,而占空比没有发生变化。
史海拾趣
|
深圳驰泰代理中颖全系列单片机,附件为选型表,欢迎大家下载。 CHIPTECH SEMICONDUCTOR CO.,LTD 深圳市驰泰电子有限公司 hidy/王芳 QQ:313030919 MSN:wfhidy@hotmail.com Tel:86-755-33340867 Fax:86-755-33340839 Mob:13590192992 E-ma ...… 查看全部问答> |
|
我现在有480*800的一个窗口 上面有背景图和其他一些图。。都贴在上面。 当我点击任意一点。如何才能把点击后规定的区域下的图片拿出来可以用?… 查看全部问答> |
|
请高手帮帮忙: 最近想把「micro C/os-ii The Real-Time Kernel 」书中的 chapter 1 之example 1-4 移植 至 s3c2440 开发板子中,却觉得不容易上手,请高手不吝多多指教,谢谢! … 查看全部问答> |
|
这两个不都是最终都是生成arm的识别的文件,有什么区别吗,生成的格式不一样?这两个环境各生成什么格式文件,如何下载或者说用什么软件下载?有人说ads一般用于裸机编程,是这回事吗? 我是菜鸟,不要喷我,感谢啦… 查看全部问答> |
|
LM317常用作电压稳压器中的调整元件,这里给大家介绍一个不寻常的应用,只要配上不多的外部元件,可以使一个12V的小灯泡闪烁发光。 如图,采用所给的元件参数值和信号,当电路接通以后,小灯泡将以4Hz的频率闪烁,当然,若改变元件参数(R2或C ...… 查看全部问答> |
|
TI给的关于FLASH历程 void main(void) { unsigned long * Flash_ptrD; // Initialize Flash pointer Seg D unsigned long value; WDTC ...… 查看全部问答> |
|
每个上司都有自己的个性,但是你知道吗,从某种程度上讲,人们的性格是可以被稍微调整的。就拿处于热恋中的人来说,就算平时最懦弱的男人,也一定会在心爱的女人面前表现出英雄气概。 就算不是恋爱,碰到了一个楚楚可怜的女孩子,很多男 ...… 查看全部问答> |




