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

完整工程下载链接 STM8单片机输出SPWM波

STM8学习笔记---利用PWM功能输出SPWM波相关推荐

  1. 利用STM32F103单片机输出SPWM波

    最近需要用到单片机输出SPWM波功能,在网上找了好多资料,发现都不完整,有算法的没有代码,有代码的看不懂算法.于是只好自己摸索,现将方法整理如下. 关于什么是SPWM波,为什么要用SPWM波,网上的介 ...

  2. STM8学习笔记---定时器 TIM4功能实现

    STM8单片机的TIM4和TIM6是8位基本定时器. 定时器功能如下: 基本定时器的功能比较简单,一般只用来实现定时功能. 基本定时器的寄存器也比较少.此处用定时器4测试,TIM4初始化代码如下: v ...

  3. STM8学习笔记---定时器 TIM2功能实现

    STM8的TIM2.TIM3.TIM5是16位通用寄存器,他们的操作方法一样. 主要功能如下 相关寄存器如下: 如果只用到定时功能的话,需要用到的寄存器有自动装载寄存器ARR.预分频寄存器PSCR.事 ...

  4. STM8学习笔记---定时器 TIM1功能实现

    STM8单片机的定时器1是一个16位定时器 定时器1为高级定时器,主要特性如下: 定时器1的寄存器比较多, 如果单纯的只是用定时功能的话,用不到这么多的寄存器.定时功能需要设置的寄存器主要有自动重装载 ...

  5. STM8学习笔记---利用UID码实现开机产生随机数

    有时候项目中需要用到开机产生随机数,而软件产生随机数必须要一个随机种子.随机种子的产生通常有下面几种方式: 用一路AD采集温度或电源噪声,取后几位作为随机信号: 将用户的交互信号时间作为随机信号: 利 ...

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

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

  7. sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map)

    sizzle.js学习笔记利用闭包模拟实现数据结构:字典(Map) 这几天学习和查看了jQuery和Property这两个很流行的前端库的御用选择器组件Sizzle.js的源代码,收获还是相对多的!之 ...

  8. 从零写一个具有IOC-AOP-MVC功能的框架---学习笔记---11. MVC功能之http请求处理器的编写---简易框架最后一公里!

    从零写一个具有IOC-AOP-MVC功能的框架-学习笔记 专栏往期文章链接: IOC功能相关章节: 从零写一个具有IOC-AOP-MVC功能的框架-学习笔记-01.项目初始化 从零写一个具有IOC-A ...

  9. STM32输出SPWM波,HAL库,cubeMX配置,滤波后输出1KHz正弦波

    SPWM波 对于功率方向,输出SPWM波是必须要掌握的 工程: stm32生成spwm代码Keil工程链接资源 引用spwm波定义: PWM波形就是指占空比可变的波形:SPWM波形是指脉冲宽度按正弦规 ...

最新文章

  1. SCALA当的trait
  2. idea中文乱码问题
  3. 2007年上半年 网络工程师 上下午试卷【附带答案】
  4. ViewBag与ViewData传值乱码问题解决方案
  5. POJ 3126 Prime Path BFS搜索
  6. 使用内置的Gallery应用程序选择图形
  7. SAP UI5 应用开发教程之五十六 - SAP UI5 树控件(tree)的开发试读版
  8. Python小数据保存,有多少中分类?不妨看看他们的类比与推荐方案...
  9. SpringCloud与Hystrix断路器
  10. 《Kotlin从零到精通Android开发》资源下载和内容勘误
  11. Eight Queens UVa 750
  12. docker学习(1) 安装
  13. hibernate教程笔记8
  14. 终于把所有的Python库,都整理出来啦!
  15. 运动会加油稿计算机学院150字,学校运动会加油稿150字10篇
  16. 1-3 Grammar
  17. QLabel实现超链接,设置超链接颜色,去掉超链接下划线方法
  18. python爬虫二:网易博客的图片
  19. SQL 语句判断英文大小写
  20. 动态规划石子排序java_动态规划之石子归并

热门文章

  1. groovy和java结合使用
  2. linux系统管理学习笔记之八---linux文件与目录的管理及权限
  3. 今天没事做了个MBTI职业倾向测试
  4. 《陪孩子像搭积木一样学编程》,一起来玩Scratch(1)使用Scratch编程的基本流程...
  5. 部署scrapy爬虫
  6. PHP arrray_filter(), array_map()区别与应用
  7. python_day9 异常处理
  8. MongoDB学习笔记(二)
  9. Delta-wave
  10. vue比php的优势,vue.js的优势是什么