【电赛电力电子方向】STM32输出SPWM波

这篇具有很好参考价值的文章主要介绍了【电赛电力电子方向】STM32输出SPWM波。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘要

在电机控制,PWM整流器,逆变器中都需要单片机输出SPWM波去控制.
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图0

调制分类

对于单相整流,逆变器有双极性调制,单极性调制,单极性倍频调制。

双极性调制

stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图1
直接将整个正弦波放在三角波里做比较。
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图2
全桥输出波形(占空比按正弦幅值变化).这个波经过LC滤波后就变成正弦波了。
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图3
matlab里搭出的双极性调制,后面写代码也是参考这个。
0.7是调制度。前面输进去的正弦波是从-1到0再到1的正弦波。将其抬高1,整个波形就只有正的,然后再除2就成了图1中的正弦波(归一化让正弦波在0到1内)。与三角波比较后输出调制波。

单极性调制

stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图4
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图5
与双极性不同,单极性调制的输出是有正有负的。可以看到,这个波要比双极性调制更接近正弦波,所以谐波含量更少。
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图6
按这种方式调制,那么全桥两边都是一会为高频开关一会为低频开关。而我们也可以只让一边做高频侧,另一边做低频侧(负责波形的正负)。

单极性倍频

。。。。。。待续

可以把调制简单的理解成,将正弦波与三角波混合。后面经过滤波器就能去除三角波得到正弦波。那么三角波(载波)其实不一定就是上面那种等腰三角形,你用只有一半的波也是可以的。
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图7
后面加滤波器就能把这个半个的三角波滤去。
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图8

STM32上实现spwm调制

可以看出,调制的核心是利用高频载波(三角波)与低频基波(正弦波)作比较得出。那么在stm上怎么实现这个过程?或者说在STM32里三角波和正弦波分别是什么,从哪里来?
stm32的pwm输出功能(中心对称计数)可以用下图形象的描述。
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图9
三角波是定时器计数值按时间的变化,方波是输出的PWM波。
可以看出改变CCR就可以改变脉冲宽度。即CCR/CNT=占空比。(当然在另一个PWM模式里就与这里的相反了)
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
图10
(实际的三角波频率要比正弦波大很多,看不清楚,这里减小了三角波的频率为了看清比较过程。)
联系上面两张图,其实就是在每次到达CCR做比较来改变脉冲宽度。那么当CCR值按正弦变化不就实现了SPWM调制了嘛。

正弦波的获取

好了,我们现在知道了。定时器的计数值就是三角波。正弦波就是按正弦变化的CCR值。
比如我们要一个50HZ的正弦波,三角波频率20KHZ。可以知道一个正弦波里包含400个三角波,而一个三角波要与正弦波比较两次,所以我们需要800个CCR值。当然,我们不追求精度,可以让一个三角波的两次比较值都一样,也就是400个CCR值。甚至可以两次三角波的比较CCR都一样,这样就只需要200个CCR了,当然这么做会损失一些精度。最好的情况当然是三角波频率足够高,比较值也足够多。
常见的CCR获取方式有下面的两种。

查表法(空间换时间)

早期的单片机由于运算性能不行,所以是先把这些CCR值存储在ROM里(RAM也行)做正弦波码表。然后这个码表可以在一些软件里生成。也可以自己提前算好。
有了码表,我们只需要每次计数器计到CCR触发中断时把CCR值更新就行了。

定时器中断运算

使用码表是因为运算性能不够,而stm32运算性能足够(使用dsp库,用C库的函数还是算起来有些慢的),可以自己去算正弦值。大致思路就是开一个定时器,每次进定时器中断的时间相同,累加就能得到时间.然后在定时器中断里计算sin(wt)
具体操作如下:

  1. 定义角频率
spwm_struct.w = 2*pi*50;						//50HZ正弦波
  1. 确定每次进入定时器中断的时间间隔
spwm_struct.T = 0.00005;						//20K的定时器中断,每次进入间隔50us
  1. 更新正弦值
spwm_struct.uref = A*arm_sin_f32(spwm_struct.WT);			//A是幅值
  1. 在定时器中断里更新角度(相位)
spwm_struct.WT += spwm_struct.w * spwm_struct.T;
if(spwm_struct.WT >= 2 * pi) spwm_struct.WT = 0;			//WT在0到2pi变化 
  1. 更新CCR
    以双极性调制为例,参考图三 CCR=(spwm_struct.uref + 1)*mod_dep/2 * CNT
    mod_dep是调制度.

实践

单片机:STM32F446RCT6
栅极驱动:IR2104。
一个2104高端接G1,低端接G2 另一个高端接G3,低端接G4
调制方式:双极性,定时器中断计算正弦波(查表实现的文章很多,这里就不展示了)
大致思路:用高级定时器输出PWM给一个2104去控制G1,G2(PWM信号与G1信号一样,2104会互补输出G2的信号)。G1和G3的信号又是互补的。所以生成互补PWM给另一个2104。

CUBEMX配置

stm32 spwm,stm32,stm32,嵌入式硬件,单片机
stm32 spwm,stm32,stm32,嵌入式硬件,单片机
定时器其他配置默认。
至于其他配置(下载,时钟等),就不展示了。

代码

定时器中断

void HAL_TIM_PeriodElapsedCallback(TIM_HandleTypeDef *htim)
{
		
	
	if(htim->Instance==TIM1)
	{
		
			spwm_struct.jibo = spwm_struct.mod_dep*arm_cos_f32(spwm_struct.wt);//更新正弦波数据
			bipolar_modulation(spwm_struct.jibo, tim_cnt, &spwm_struct);
			TIM1->CCR1 = spwm_struct.ch1_ccr;
			
			spwm_struct.wt += spwm_struct.w * spwm_struct.T;//更新相角wt
			if(spwm_struct.wt>=2*pi)	spwm_struct.wt=0;//计满2π后归零,防止溢出
		
	}

}

双极性调制

/**
 * @brief 双极性调制
 * 
 * @param insignal 输入基波 (-1到1变化)
 * @param cnt 当时定时器cnt值
 * @return unsigned int 
 */
void bipolar_modulation(float insignal, unsigned short cnt, spwm_t *ccr)
{
    
    insignal = (insignal+1) / 2;
    ccr->ch1_ccr = insignal * (cnt - 1);
}

主函数while1前放的初始化

void spwm_init()
{
	/*参数初始化*/
	spwm_struct.w = 2*pi*50;		//2*pi*f
	spwm_struct.wt = 0;
	spwm_struct.fre = 50;
	spwm_struct.uref = 1;
	spwm_struct.rqd_flag = 1;
	spwm_struct.mod_dep = 0.5;		//调制度
	spwm_struct.T = 0.0005;
	/*2104使能*/
	HAL_GPIO_WritePin(GPIOB,GPIO_PIN_5,GPIO_PIN_SET);
	/*PWM输出开启*/
	HAL_TIM_Base_Start_IT(&htim1);
	HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
	HAL_TIMEx_PWMN_Start(&htim1, TIM_CHANNEL_1);
	
}

spwm结构体

typedef struct
{
	float w;					//角频率
	float fre;					//频率
	float wt;					//相角
	float mod_dep;				//调制度
    short ch1_ccr;				//ccr1
    short ch2_ccr;		
	float jibo;
	float T;					//每次进入定时器中断的时间
}spwm_t;

stm32 spwm,stm32,stm32,嵌入式硬件,单片机
欢迎加入扣扣交流群,群号:807477521文章来源地址https://www.toymoban.com/news/detail-854997.html

到了这里,关于【电赛电力电子方向】STM32输出SPWM波的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SPWM波调制度原理

      先看PWM波是怎样通过调节占空比实现对输出幅度调控的,如图所示,PWM波占空比为 D = T p T D=frac{T_p}{T} D = T T p ​ ​ PWM波经过低通滤波后,高频分量被滤除,仅保留了直流分量,根据信号系统知识,直流分量为 a 0 = 1 T ∫ T s ( t ) d t a_0=frac{1}{T}int_{T}s(t)dt a 0 ​ = T 1 ​ ∫

    2024年02月08日
    浏览(22)
  • SPWM 与 SVPWM 原理及算法

    所谓SPWM,就是在PWM的基础上改变了调制脉冲方式,脉冲宽度时间占空比按正弦规律排列,这样输出波形经过适当的滤波可以做到正弦波输出。它广泛地用于直流交流逆变器等,比如高级一些的UPS就是一个例子。三相SPWM是使用SPWM模拟市电的三相输出,在变频器领域被广泛的采

    2024年02月03日
    浏览(14)
  • 备赛电赛学习STM32篇(九):ADC

    目录 一、ADC的简介 二、逐次逼近型ADC 2.1、逐次逼近型ADC框图  2.2、STM32 ADC内部介绍 2.2.1、STM32ADC的通道以及存储数据的寄存器  2.2.2、触发方式 2.2.3、STM32ADC时钟部分 2.2.4  三、ADC基本结构框图 四、另外的细节问题 4.1、输入通道 4.2、转换模式 4.2.1、单次转换、非扫描模式

    2024年02月05日
    浏览(10)
  • 2018年电赛A题 软件部分 STM32 FFT 时域到频域 STM32cubeMX HAL

    题目要求:任意波信号发生器输出非正弦信号时,基波频率范围为50Hz~200Hz,测量电流信号基波频率,频率测量精度优于1%;测量基波及各次谐波分量的幅度(振幅值),电流谐波测量频率不超过1kHz,测量精度优于5% 。 实现方式:利用STM32单片机内置ADC对待测信号进行采集,

    2024年02月15日
    浏览(27)
  • 【电赛-软件】基于ST官方插件 配置VScode开发STM32

    基于ST官方插件 配置VScode开发STM32 先决条件: 安装插件 插件使用 创建工程 导入工程 编译工程 调试 官方链接:https://marketplace.visualstudio.com/items?itemName=stmicroelectronics.stm32-vscode-extension。 ST官方论坛:https://community.st.com/s/topic/0TO3W00000006cJWAQ/vscode-for-stm32。 需要提前安装 STM32Cu

    2024年02月05日
    浏览(12)
  • 电赛备赛日记(一):K210与STM32串口通信

       拖更了n久的备赛日记终于来啦,最近实现了关于K210图像识别并将所需数据(即目标类别,目标在图像中的加权坐标)其中,加权坐标指K210识别到的目标并框出的框的宽和高与框左上顶点的坐标加权,希望以此来判断目标所处的位置并方便后续进行诸如寻迹,目标跟随等

    2024年02月04日
    浏览(17)
  • 关于SPWM和SVPWM算法相电压的疑惑解答

             如图为交-直-交PWM变频器主回路结构,左边为不可控整流桥,将三相交流电整流成电压恒定的直流电压,右边是逆变器,将直流电压变换为频率与电压均可调的交流电,中间的滤波环节是为了较小直流电压脉动而设置的。 正弦波脉宽调制(SPWM)技术         以

    2024年02月14日
    浏览(11)
  • 基于PID算法下STM32控制的坡道行驶电动小车(2020年电赛)

    本题源于2020年TI杯大学生电子设计竞赛C题-----坡道行驶电动小车 由于手上没有MSP430/MSP432 板子,所以本篇采用stm32实现 任务 利用 TI 的 MSP430/MSP432 平台,设计制作一个四轮电动小车。要求小车能沿着指定路线在坡道上自动循迹骑线行驶。小车必须独立运行,车外不能使用任何

    2024年02月16日
    浏览(11)
  • STM32编码器模式(带方向/正交编码)

    看前说明 :这里重点介绍的时STM32的定时器编码器模式,是根据STMF10x参考手册,如果有使用过编码器或编码器不一样的可以直接跳过前面的编码器介绍,直接看理论分析与程序部分。 这里需要注意的参数 输出脉冲线数:1024线: 编码器每旋转一周输出的脉冲的个数 ,这个数

    2023年04月24日
    浏览(17)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包