历史上的今天
返回首页

历史上的今天

今天是: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电路的参数选择,根据实际项目要求自行调整。

推荐阅读

史海拾趣

ERNI公司的发展小趣事

进入21世纪,ERNI继续深耕连接器技术。他们成功研发出世界上第一个DIN连接器,并随后发展了各种电路板连接器和输入/输出连接器。其中,2mm连接器成为ERNI的明星产品之一。凭借其优越的性能和可靠的品质,ERNI的2mm连接器在国内军工领域得到广泛应用,并赢得了广大客户的信赖和好评。

Eink公司的发展小趣事
1996年4月,麻省理工学院(MIT)的贝尔实验室成功制造出了电子纸的原型,这一技术吸引了众多科技公司的注意。其中,E-Ink公司就是基于MIT的这项技术于1997年成立,开始全力研究将电子纸商品化的可能性。经过两年的努力,E-Ink在1999年推出了名为Immedia的用于户外广告的电子纸,标志着电子纸技术的初步商业化应用。
EOREX公司的发展小趣事

在电子产品质量参差不齐的市场环境下,EOREX公司始终坚持品质至上的原则。他们严格把控生产过程中的每一个环节,确保产品的质量和性能达到最高标准。同时,EOREX还建立了完善的售后服务体系,为客户提供及时、专业的技术支持和解决方案。这些举措使得EOREX的产品在市场上赢得了良好的口碑和信赖度,为公司的发展奠定了坚实的基础。

台湾第一电阻(Firstohm)公司的发展小趣事
电冰箱电路中常见的易损部件包括启动继电器、过载保护器、温控器等。启动继电器负责启动压缩机,如果其性能不良或损坏,将导致压缩机无法启动。过载保护器用于保护压缩机免受过载损坏,如果其触点接触不良或损坏,也可能导致压缩机无法正常工作。温控器用于控制冰箱的温度,如果其出现故障,将影响冰箱的制冷效果。
Hirose Electric公司的发展小趣事
电冰箱电路中常见的易损部件包括启动继电器、过载保护器、温控器等。启动继电器负责启动压缩机,如果其性能不良或损坏,将导致压缩机无法启动。过载保护器用于保护压缩机免受过载损坏,如果其触点接触不良或损坏,也可能导致压缩机无法正常工作。温控器用于控制冰箱的温度,如果其出现故障,将影响冰箱的制冷效果。
博林(BL)公司的发展小趣事

博林公司自创立以来,一直致力于电子行业的技术创新。公司拥有一支专业的研发团队,不断投入巨资进行技术研发和创新。在某一时期,博林公司成功开发出了一款具有颠覆性的电子产品,凭借其卓越的性能和独特的设计,迅速在市场上获得了广泛认可。这款产品的成功推出,不仅为博林公司带来了巨大的经济效益,也进一步巩固了其在电子行业的领导地位。

问答坊 | AI 解惑

选择空调器应注意些什么

本帖最后由 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位是成功的; 请指教 ...…

查看全部问答>

如何实现1拖N的多线程ISP编程?

资料下载地址: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 ...…

查看全部问答>

再次求助:Z-stack运行受阻

唉,昨天问的问题还没解决,今天调试的时候又遇到了更棘手的问题:程序总是在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之间的杂散电 ...…

查看全部问答>

atmel 9200 usb的问题

用9200接usb,使能上拉后电脑检测到未知设备,这之后要把上拉撤掉么?我用bushound怎么都抓不到数据啊,连pc发给9200的第一个get命令都抓不到,完全是没有任何反应啊…

查看全部问答>

急呀

谁有12864液晶屏的程序…

查看全部问答>