如何计算产生SPWM所需要的占空比

SPWM波调制度原理 阅读详情
[cpp]  view plain  copy
  1. /** @author Mei Jilin 
  2.     @date   2013/9/2 
  3.     @brief  加入生成SPWM部分 
  4. **/  
  5. #include "timer.h"  
  6. #include "led.h"  
  7. static uint16_t CCR3_Val = 1800;  
  8. static uint16_t PrescalerValue = 0;  
  9.   
  10. /*PWM输出配置说明,*/  
  11. /* - Prescaler = (TIM3CLK / TIM3 counter clock) - 1 选择TIMER工作在36MHZ 
  12.  
  13.     The TIM3 is running at 36 MHz: TIM3 Frequency = TIM3 counter clock/(ARR + 1) 
  14.                                                   = 36 MHz / 3600 = 10 KHz 
  15.     TIM3 Channel1 duty cycle = (TIM3_CCR1/ TIM3_ARR)* 100 */  
  16.     /*转换周期10K*/  
  17. void PWM_Init(void)  
  18. {  
  19.     TIM_TimeBaseInitTypeDef     TIM_TimeBaseStructure;  
  20.     TIM_OCInitTypeDef           TIM_OCInitStructure;  
  21.     GPIO_InitTypeDef            GPIO_InitStructure;  
  22.     NVIC_InitTypeDef NVIC_InitStructure;      
  23.         /* TIM3 clock enable */  
  24.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);  
  25.   
  26.     /* GPIOA and GPIOB clock enable */  
  27.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|  
  28.                              RCC_APB2Periph_AFIO, ENABLE);  
  29.     /* GPIOA Configuration:TIM3 Channel1, 2, 3 and 4 as alternate function push-pull */  
  30.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_8;  
  31.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  
  32.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;  
  33.     GPIO_Init(GPIOA, &GPIO_InitStructure);  
  34.       
  35.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13;      //TIM1_CH1N  
  36.     GPIO_Init(GPIOB, &GPIO_InitStructure);  
  37.       
  38.      /* Compute the prescaler value */  
  39.     PrescalerValue = (uint16_t) (SystemCoreClock / 36000000) - 1; //TIMER2 - 36MHZ  
  40.     /* Time base configuration */  
  41.     TIM_TimeBaseStructure.TIM_Period = 3600;                    /*TIM3_ARR = 2879,12.5Khz*/  
  42.     TIM_TimeBaseStructure.TIM_Prescaler = PrescalerValue;  
  43.     TIM_TimeBaseStructure.TIM_ClockDivision = 0;  
  44.     TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  
  45.     TIM_TimeBaseStructure.TIM_RepetitionCounter = 0;  
  46.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);  
  47.   
  48.     /* Channel 1, 2,3 and 4 Configuration in PWM mode */  
  49.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;  
  50.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  
  51.     TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable; //关闭互补输出  
  52.     TIM_OCInitStructure.TIM_Pulse = CCR3_Val;  
  53.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;  
  54.     TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;  
  55.     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;  
  56.     TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCIdleState_Set;  
  57.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);  
  58.       
  59.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Enable); //这句的功能是让改变CCR2之后马上有效      
  60.     TIM_ITConfig(TIM1, TIM_IT_CC1, ENABLE);  
  61.     NVIC_PriorityGroupConfig(NVIC_PriorityGroup_1);  
  62.     NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;  
  63.     NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  
  64.     NVIC_InitStructure.NVIC_IRQChannelSubPriority = 6;  
  65.     NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;  
  66.     NVIC_Init(&NVIC_InitStructure);      
  67.           
  68.     TIM_Cmd(TIM1, ENABLE);    
  69.     /* TIM1 Main Output Enable */  
  70.     TIM_CtrlPWMOutputs(TIM1, ENABLE);   //TIM1需要加上这句,貌似低级定时器不需要  
  71. }  
  72. uint16_t Duty[] = {1800,1856,1912,1968,2023,2078,2131,2183,2233,2282,2329,2373,2416,2456,2493,  
  73.     2528,2559,2588,2614,2636,2655,2671,2684,2692,2698,2699,2698,2692,2684,2671,2655,2636,2614,  
  74.     2588,2559,2528,2493,2456,2416,2373,2329,2282,2233,2183,2131,2078,2023,1968,1912,1856,1800,  
  75.     1743,1687,1631,1576,1521,1468,1416,1366,1317,1270,1226,1183,1143,1106,1071,1040,1011,985,  
  76.     963,944,928,915,907,901,900,901,907,915,928,944,963,985,1011,1040,1071,1106,1143,1183,1226,  
  77.     1270,1317,1366,1416,1468,1521,1576,1631,1687,1743,1799,1799};  
  78. uint16_t count = 0;  
  79. uint16_t num = sizeof(Duty)/(sizeof(Duty[0]));  
  80. void TIM1_CC_IRQHandler(void)  
  81. {  
  82.   if (TIM_GetITStatus(TIM1, TIM_IT_CC1) != RESET)  
  83.   {  
  84.     TIM1->SR = (uint16_t)~TIM_IT_CC1;  
  85.     TIM1->CCR1 = Duty[count];  
  86.     count++;  
  87.     if(count==num)  
  88.     {  
  89.         count=0;  
  90.     }  
  91.   }  
  92. }  



在上一篇文章里粘贴了STM32产生SPWM的代码,我在编写这些代码时最大的问题就是如何得到占空比,就是代码中的数组 Duty[]。他的思想就是对正弦波采样,在采样点出用PWM的占空比来代替正弦波在该点的数值。最容易想到就是用定时器的ARR值乘以sin(2*pi*f*t),就可以得到对应的寄存器CCR值。但是CCR值不能为负,所以要把sin(2*pi*f*t)变为

A*sin(2*pi*f*t)+B的形式,取A=B=0.5;那么计算公式为ARR*(0.5*sin(2*pi*f*t)+0.5),上传一个C++写的exe文件,可以帮助产生Duty[]数组.

http://download.csdn.NET/detail/mjlsuccess/6205567

软件使用vs2010编写的可能在有些电脑上无法运行,如果你装有VS2010,我可以把原工程发给你

转载于http://blog.youkuaiyun.com/mjlsuccess/article/details/11019805

自己思考:10KZ为载波(锯齿波)的频率,最终输入给电机为100HZ正弦波,则载波比为100,也就是100个数据,同时ccr不能为负值,故进行抬升,原本应该为0-1800,进行抬升1800的0.5倍

利用MATLAB计算SPWM脉冲宽度与并应用STM32输出 利用MATLAB提取交点,计算SPWM周期,占空比,并使用STM32单片机输出SPWM,完成了MATLAB与STM32单片机综合运用的小实践。 阅读详情

相关推荐

利用28335的epwm产生spwm波的总结

设计的内容是产生倍频的SPWM波,也即是用的是同一个调制波,两个桥臂上的载波相差180度。                                                                                                                            28335有多个epwm模块,每个epwm模块可以产生2个波

E_ROAD_BY_U的博客 2万+

什么是占空比?什么是周期?什么是频率?

1、占空比(Duty Cycle)是脉冲信号中高电平持续时间与整个周期时间的比率。它通常用于描述脉冲宽度调制(PWM)信号,其中信号在一定频率下在高电平和低电平之间切换。 2、周期是描述脉冲信号或任何周期性信号的一个基本参数。它指的是信号完成一次完整循环所需要的时间。对于脉冲信号而言,周期是指从 一个脉冲的起点 到 下一个相同脉冲起点 的时间间隔。 3、频率是指单位时间内脉冲信号重复出现的次数。频率的单位通常是赫兹(Hz),表示每秒的周期数。

啊维的博客 6万+

STM32F0实现数字化SPWM纯正弦波逆变器

这个没啥好说的,搭电路的事。其核心思想是两边桥臂分别由两个180度相位差的正弦波与三角载波比较来控制,优点是在开关器件工作频率一样的情况下,输出PWM频率是单极性SPWM的2倍,能够明显减少谐波,因此只需要相对较小的电感和电容滤波器件就可以起到很好的滤波效果,提升了系统的性能,也精简了系统体积,降低了成本。而双极性pwm则是在整个正弦周期内,四只管子都在高频开关状态工作,对角线上的管子一起导通,另一对角线上管子互补导通,实际上只需要一路互补的PWM控制,负载上电压在正电压和负电压之间切换,不出现0v。

forlifefor的专栏 1万+

SPWM

1.SPWM技术就是希望输出的电压波形是正弦波,通过调节占空比来实现调节平均电压的方法。 2.三角波作为载波(设置epwm的周期寄存器)    正弦波作为调制波 3.原理:DSP定时器产生三角波为增减计数,没有负半波,因此把坐标远点定在三角波的波谷,以得到双极性SPWM 假设:三角波载波幅值为Ur/2,周期为Tr,频率为fr,正弦波幅值为Us 1)得正弦波函数:us=Us*sin(wts)

zhuangjianyu123的博客 1万+

SPWM基本原理详解(图文并茂+公式推导+C程序实现)

SPWM简单实现

一名热爱技术的工程师的博客。分享技术干货,记录美好生活。永远相信美好的事情即将发生。 16万+

计算生成SPWM的占空比的软件

产生spwm占空比,输出文件 data.txt 保存占空比数组, log.txt保存一些参数

单片机SPWM的产生

电赛刚结束不久,期间我做的题目需要用单片产生一个三相的SPWM波,然后再通过硬件电路LC滤波形成正弦波。 我用的单片机是STC15F2K60S2,然后通过自然数查表法控制内部3路PWM产生SPWM信号,而且生成的正弦波相位是相差120°,并且频率是50Hz。要让单片机产生正确可用的SPWM,需要编程一定的算法来产生波形。 我们根据整合为1的思想,将正弦波分成305等分,因为频率需要50HZ,那么

hpf247的博客 1万+

python特征选择pso_【来点干货】机器学习中常用的特征选择方法及非常详细的Python实例...

花费了很长时间整理编辑,转载请联系作者授权,违者必究。特征选择(Feature selection)是在构建预测模型的过程中减少输入变量的一个过程。它是机器学习中非常重要的一步并在很大程度上可以提高模型预测精度。这里我总结了一些机器学习中常见的比较有用的特征选择方法并附上相关python实现code。希望可以给大家一些启发。首先,我们为什么要进行特征选择呢?它有以下几个优点:减少过拟合:冗余数据常...

weixin_39927158的博客 1164

SPWM正弦波控制

本文主要介绍SPWM原理及C语言单片机的实现

嵌入式分享 1万+

生信入门第七课:使用FastQC软件进行测序原始fastq数据质控

从实验到数据:RNA定量、文库片段长度、fastqc质控和fastp去接头

微生信 490

基于单片机负载控制的无人机电气设备监测系统设计

为深入分析无人机电气设备的电子负载性能,实现对传输电子量的合理性监管与控制,设计基于单片机负载控制的无人机电气设备监测系统;利用电气信号发生电路,构建负载网络控制器与以太网模块运行所需的电气设备负载环境,借助PCB监控板建立PLC扩展负载模块与核心监控主机之间的物理连接关系,实现无人机电气设备监测系统的硬件执行环境搭建;在此基础上,通过STM32型单片机移植协议,确定无人机电气设备通信主机的现有组态形式,联合已设定的监控任务有线级条件,实现监测系统的软件执行环境搭建,完成基于单片机负载控制的无人机电气设备监

weixin_45905610的博客 1300

SPWM的个人理解

作为一个刚刚毕业的学生,脑子里,对论文的内容还比较深刻,现在开始重新梳理一遍 我的论文主要描述的是逆变器的控制信号-----PWM信号,全称叫脉宽调制技术。其实就是一个占空比可调的矩形波信号。 占空比:一个周期内,高电平时间/周期时间*100%; 我们使用单片机等设备,产生一个PWM信号,去测量不同占空比的PWM,其端口电压不同,占空比越小,电压越小;反之电压越大; 举个例子:呼吸灯(当初大一的时...

qq_38295660的博客 7238

TOPSIS与熵权法实战:从数学建模到Python实现(附国赛案例分析)

本文详细解析了TOPSIS(逼近理想解排序法)与熵权法在数学建模中的协同应用,并通过Python代码实现完整流程。文章以国赛案例为背景,从指标正向化、数据标准化、熵权法计算客观权重,到TOPSIS综合排序,手把手指导如何解决多指标决策问题,为数据分析与建模提供了一套可复用的实战工具箱。

weixin_29079643的博客 245

利用stm32cubemx生成单极性倍频spwm调制代码步骤

利用stm32cubemx生成单极性倍频spwm调制代码;基于stm32f407vet6; 开关频率10k,驱动全桥电路时可起到20khz的效果,对于2022年电赛,需要用到两个全桥拓扑,单极倍频调制方式相较于双极性spwm调制,装置损耗可以得到一定程度的减少。.........

m0_65265936的博客 1万+

STM32Cube高效开发教程<基础篇>(一)----概述

一、 STM32系列器件和开发工具发展历史声明:本人水平有限,博客可能存在部分错误的地方,请广大读者谅解并向本人反馈错误。本专栏博客参考《STM32Cube高效开发教程(基础篇)》,有意向的读者可以购买正版书籍辅助学习,本书籍由王维波老师、鄢志丹老师、王钊老师倾力打造,书籍内容干货满满。一、 STM32系列器件和开发工具发展历史。

我的博客 1172

【实践】VECTOR AUTOSAR创建SWC读写CAN信号

在AUTOSAR开发中最必要的功能就是读写CAN信号,本文通过一步步说明,介绍如何开发SWC来读写CAN信号,可以说在AUTOSAR中实现读写CAN信号的实践过程,是一个非常基础且典型的练习。在本篇文章阅读之前,推荐阅读AUTOSAR RTE介绍,本篇文章介绍了RTE的比较全面的介绍了AUTOSAR RTE。理解了RTE之后,才能对SWC的设计更加清楚。话不多说,接着上一篇内容VECTOR DaVinci从0到1搭建工程,此篇文章我们介绍如何在DaVinci Developer中开发SWC访问CAN信号。为

酒无忧的博客 1231

单相逆变器及基于STM32 SPWM生成代码

最近在做单相逆变器,用篇文章来记录。 主电路采用H桥,使用IR2104半桥驱动内置630ns死区,上管采用自举电容浮地驱动 SPWM采用STM32F103C8T6产生两路互补的30K Hz 的SPWM。 LC滤波器的截止频率约为开关频率的1/10~1/5,我选的是30KHz的开关频率,则LC滤波器的截止频率约为3K,即截止频率越小越好。 电流检测采样ACS712,该芯片可以直...

qq_26988431的博客 3万+

YOLOv11+BiFPN双向特征金字塔:全方位解析多尺度检测性能优化指南

飞书链接:https://ecn6838atsup.feishu.cn/wiki/EhRtwBe1CiqlSEkHGUwc5AP9nQe?购买即可解锁800+YOLO优化文章,并且还有海量深度学习复现项目,价格仅需两杯奶茶的钱,每日更新。函数中添加BiFPN的解析逻辑(找到。链接可用,不要多复制空格了。密码:946m22&8。

FJN110的博客 306

MATLAB产生SPWM比较占空比

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34110749的博客 1234

使用ChatGPT工具阅读文献的实战教程

本文介绍核心内容为使用ChatGPT工具阅读文献,希望对学习和使用ChatGPT的同学们有所帮助。为了兼顾质量和速度,本专栏的更新频率为一周一到两更。 文章目录 1. 前言 2. 实战教程 2.1 下载工具并登录 2.2 提取文献中的关键信息

herosunly的博客 15万+

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

基于HAL库利用CubeMX产生双极性SPWM波

在进行配置编写之前,先搞懂基本原理,可以使操作更连贯。脉冲波一般表现出三个特征:幅度、频率、宽度(占空比)。幅度即脉冲波的最大值,频率则是脉冲波单位时间内脉冲的数量(也可以说是相邻两个脉冲起始位置的时间差的倒数),宽度是一个周期内脉冲持续的时间,占空比则是用这个时间除以周期得到的数值。载波和调制波的概念:载波可以理解为是用来承载某个信号的某些信息的容器,这里的某种信号称之为调制波。

m0_74273086的博客 2132

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

spwm matlab 计算波表,利用MATLAB计算SPWM脉冲宽度与并应用STM32输出

先上一张spwm波形生成原理图:首先利用MATLAB产生三角波与正弦波叠加:%% 产生正弦波与三角波叠加y1=abs(sawtooth(a*2*pi*m,0.5));%三角波y2=0.8*sin(a*pi);%正弦波figure(1)plot(a,y1,a,y2)如图:接着取交点,想了两种方法:1.直接图片上取点,该方法不精确,毕竟只能目测和用鼠标点击。[X Y]=ginput(40)%图像中取点...

weixin_29745919的博客 1445

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

电子设计竞赛(三)-SPWM与PID

1 SPWM波调制技术  逆变电路的控制方式主要是采用SPWM(正弦脉宽调制技术),IR2104控制开关管的通断来实现正弦调制,SPWM的基本思路是将一个正弦波按等宽间距分成N等份,对...

张巧龙的博客 1万+

SPWM 与 SVPWM 区别

在FOC算法(见前文《永磁同步电机力矩控制(二):FOC与DTC》)中,针对DQ两轴的PI算法计算出来得到DQ轴电压,经过反PARK变换后可得到α轴和β轴电压,但这些个电压都只是一个计算机里面的数值而已,如何转化成实实在在的加载到电机相线上的端电压,那么就需要用到由电力电子开关器件(MOSFET或IGBT)所组成的驱动桥来实现。 假设控制程序希望电机相线上有一个3V的电压,而电池的供电只有一个稳定的12V,怎样得到这个3V呢?这就是SPWM或SVPWM要干的事情。 PWM的理论依据:冲量等效原理 .

u010783226的专栏 1万+
上一篇: d-q坐标轴
下一篇: RC电路(积分电路,微分电路)
小白study
博客等级 码龄12年 659粉丝 25原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值