历史上的今天
今天是:2024年09月24日(星期二)
2021年09月24日 | STM8学习笔记---利用PWM功能输出SPWM波
2021-09-24 来源:eefocus
要生成SPWM波,其关键是要生成一组正弦规律变化的数字,然后将数字对应成PWM输出的占空比,按照顺序输出占空比就行。生成正弦波的方法在 使用C语言产生正弦波数据 这篇博客有详细说明,这里就不说了。
本例程中生成的64个数据是:50,54,59,64,69,73,77,81,85,88,91,94,96,97,99,99,100,99,99,97,96,94,91,88,85,81,77,73,69,64,59,54,50,45,40,35,30,26,22,18,14,11,8,5,3,2,0,0,0,0,0,2,3,5,8,11,14,18,22,26,30,35,40,45
它所组成的波形为

下面看C代码的实现
u16 FRE = 500; //frequency 频率 4M / 500 = 8K
void PWM_GPIO_Init( void )
{
PC_DDR |= ( 1 << 7 ); //PC7 推挽输出
PC_CR1 |= ( 1 << 7 );
PC_ODR_ODR7 = 0;
}
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_OUT( unsigned int DC )
{
TIM1_CCR2H = DC >> 8; //捕获比较寄存器高8位
TIM1_CCR2L = DC; //捕获比较寄存器低8位 占空比值
}
首先初始化要用到的IO口,这里使用的是定时器1的通道2也就是PC7口,下来设置定时器1的通道2为PWM输出模式,设置PWM模式的时候要使能PWM的预装载功能,这样重新设置占空比的时候,定时器会自动装载新设置的占空比值。
将设置占空比单独封装一个函数,要改变占空比的时候,只需要调用这个函数,将占空比传递进来就行。下来在主函数中不停的按照正弦规律改变占空比值就行了。
#include "iostm8s103F3.h"
#include "pwm.h"
const unsigned int sineData[64] = {50, 54, 59, 64, 69, 73, 77, 81, 85, 88, 91, 94, 96, 97, 99, 99, 100, 99, 99, 97, 96, 94, 91, 88, 85, 81, 77, 73, 69, 64, 59, 54, 50,
45, 40, 35, 30, 26, 22, 18, 14, 11, 8, 5, 3, 2, 0, 0, 0, 0, 0, 2, 3, 5, 8, 11, 14, 18, 22, 26, 30, 35, 40, 45
};
void SysClkInit( void )
{
CLK_SWR = 0xe1; //HSI为主时钟源 16MHz CPU时钟频率
CLK_CKDIVR = 0x00; //CPU时钟0分频,系统时钟0分频
}
void delay_ms( unsigned int ms )
{
unsigned int i, j;
while( ms != 0 )
{
for( i = 0; i < 61; i++ )
for( j = 0; j < 50; j++ );
ms--;
}
}
void main( void )
{
unsigned char i = 0;
SysClkInit();
__asm( "sim" );
TIM1_Init();
__asm( "rim" );
while( 1 )
{
for( i = 0; i < 64; i++ )
{
TIM1_CH2_OUT( sineData[i] );
delay_ms( 1 );
}
}
}
输出PWM波形如下

在PWM输出口PC7口加上RC电路后波形如下

占空比的数值和RC电路的参数选择,根据实际项目要求自行调整。
史海拾趣
|
本帖最后由 jameswangsynnex 于 2015-3-3 19:58 编辑 空调器的选购,一般应该注意下列三个方面:型式、制冷量和产品质量的选择。 (1)型式的选择 一般来说,窗式空调器具有安装比较方便,体积小,重量轻,价格低等优点,适用于小房间使用,但噪声 ...… 查看全部问答> |
|
注塑机运行时,每个周期内昂贵的模具都可能因为残留或滑块错位而有损坏的危险,上海协之塑机电有限公司(http://www.pt88.cn)主导的模具保护器(模具监视器)可以防止这些情况发生! 时下最先进的机器视觉技术用来进行检查,自动防止闭模并报警, ...… 查看全部问答> |
|
请教:MT8888+TEA1062,拨打本地座机、本地、外地手机都成功,打外地的座机(加区号12位)不成功 比如: 打外地座机0771 1234567 共11位是成功的; 打本地座机12345678 共8位是成功的; 加区号打本地座机0755 12345678共12位就说号码不存在; 打外地手机0123456789AB共12位是成功的; 打本地手机123456789AB共11位是成功的; 请指教 ...… 查看全部问答> |
|
资料下载地址:http://cid-5a653ddbd9fe9e8b.skydrive.live.com/self.aspx/.Public/avr-usb-only-one-press-download.rar(不能使用快速下载,点击页面下载即可) 这个软件实现了一台电脑接多个USB ISP编程器,最多可达USB的设备极限127个,且自动识 ...… 查看全部问答> |
|
二手开发板,IC呆料免费交易平台www.dz-dailiao.cn,www.电子呆料.cn 二手开发板,IC呆料免费交易平台www.dz-dailiao.cn,www.电子呆料.cn… 查看全部问答> |
|
弱问tonado搞手。为什么打开local file system的文件失败 主机操作系统windows2000 (vmware上的虚拟机 vmware版本5.5.3) Tonado版本 2.2 Target:(simulator) CPU: VxSim for Windows Runtime Name: VxWorks Runtime Version: 5.5 BSP version: 1.2/1 &nb ...… 查看全部问答> |
|
唉,昨天问的问题还没解决,今天调试的时候又遇到了更棘手的问题:程序总是在osal_start_system()这个操作系统函数里循环,即下面的函数段 do { if (tasksEvents[idx]) // Task is highest priority that is ready. { ...… 查看全部问答> |
|
Datasheet 中 Pin Capacitance(元件的引脚电容) 为了便于分析,首先给出如图所示的引脚电容模型分析图,引脚1和引脚2之间存在耦合电容Ccouple。 图 引脚电容模型分析图 信号在引脚1和引脚2上引入的百分比串扰可用如下公式计算得出: 式中,Ccouple为引脚1和引脚2之间的杂散电 ...… 查看全部问答> |
|
用9200接usb,使能上拉后电脑检测到未知设备,这之后要把上拉撤掉么?我用bushound怎么都抓不到数据啊,连pc发给9200的第一个get命令都抓不到,完全是没有任何反应啊… 查看全部问答> |




