基于stm32的逆变的spwm

glsgxh 2017-10-02 10:06:10
用stm32产生的那个spwm那个数组是怎么得到的 具体的是怎么算的 还有就是逆变成特定频率的正弦波时中断周期怎么计算 ?同时产生pwm的周期与每次给占空比的中断周期有什么关系?
...全文
2027 18 打赏 收藏 转发到动态 举报
写回复
用AI写文章
18 条回复
切换为时间正序
请发表友善的回复…
发表回复
GlenXu_007 2021-03-14
  • 打赏
  • 举报
回复
总归有浮点,有大量中断处理,所以,最好选用32F4xx,否则输出信号质量不能保证。
qq_32146753 2021-03-14
  • 打赏
  • 举报
回复
还是说的很到位的,一起学习了
worldy 2020-11-23
  • 打赏
  • 举报
回复
A[i]=M*Sin(2*PI*/N * i) M:采样输出的最大值 N:一周期的正弦波采样点数
恆 ღ 訫 2020-11-19
  • 打赏
  • 举报
回复
学习了,说得真好
qq_42859643 2020-07-30
  • 打赏
  • 举报
回复
学习了,说得真好
liangweibeijing 2018-11-27
  • 打赏
  • 举报
回复
引用 12 楼 tianxj001 的回复:
STM32F103 做3相硬件方面完全具备,本身,tim1就可以有3个带互补输出的比较输出通道。 如果设计的是三相120度逆变器,只需要对整个方案进行少许改进,这里由于必须有120度相位角差,因此,正弦波数据表必须是3的整倍数,这里比如我们取360个采样值,然后我们只需要保存180个半正弦波数据,全正弦波周期还是360,然后根据中断计数,分别进行i+120,i+240三个采样点,当然数据要经过极性正负判断,和超过360的进位循环处理。然后分别在每个tim比较寄存器里面填入该数据就可以了。这样就直接获得了3相互补驱动信号了。 发现对PWM你好像非常不清楚,PWM是一系列占空比受控制数据影响的方波信号,对于典型的半桥而言,50%占空比的,就等于0,低于50%的,是负,高于50%的是正。 而我们只需要在tim1的比较寄存器输入周期数据的一半,就可以获得50%的PWM信号,这时候,PWM周期计数器数据和时钟决定了PWM载波频率,而我们根据比较中断刷新的动态比较数据,可以让我们按照设计好的周期,发生任意函数调制波形,如果我们刷新的是正弦波数据,那么我们就可以在PWM的解调端获得正弦波,正弦波周期取决于我们刷新的数据和载波的比值。
“对于典型的半桥而言,50%占空比的,就等于0,低于50%的,是负,高于50%的是正。” 此处应该是H桥(全桥)吧,Umotor=(2 ρ-1) Usource 其中Umotor为电机电压,Usource为直流动力电源电压,ρ为占空比
tianxj001 2017-10-05
  • 打赏
  • 举报
回复 4
STM32F103 做3相硬件方面完全具备,本身,tim1就可以有3个带互补输出的比较输出通道。 如果设计的是三相120度逆变器,只需要对整个方案进行少许改进,这里由于必须有120度相位角差,因此,正弦波数据表必须是3的整倍数,这里比如我们取360个采样值,然后我们只需要保存180个半正弦波数据,全正弦波周期还是360,然后根据中断计数,分别进行i+120,i+240三个采样点,当然数据要经过极性正负判断,和超过360的进位循环处理。然后分别在每个tim比较寄存器里面填入该数据就可以了。这样就直接获得了3相互补驱动信号了。 发现对PWM你好像非常不清楚,PWM是一系列占空比受控制数据影响的方波信号,对于典型的半桥而言,50%占空比的,就等于0,低于50%的,是负,高于50%的是正。 而我们只需要在tim1的比较寄存器输入周期数据的一半,就可以获得50%的PWM信号,这时候,PWM周期计数器数据和时钟决定了PWM载波频率,而我们根据比较中断刷新的动态比较数据,可以让我们按照设计好的周期,发生任意函数调制波形,如果我们刷新的是正弦波数据,那么我们就可以在PWM的解调端获得正弦波,正弦波周期取决于我们刷新的数据和载波的比值。
glsgxh 2017-10-05
  • 打赏
  • 举报
回复
还有我那个spwm数组是用vc写的是把得到的数据放到数组 并不是直接在工程里计算得到
glsgxh 2017-10-05
  • 打赏
  • 举报
回复
而我最终是要得到3相互差120的正弦波
glsgxh 2017-10-05
  • 打赏
  • 举报
回复
我大致明白你的意思 你的意思是利用互补输出 只要输出半个周期 后半个周期是利用互补通道输出 我是一个通道全波输出 把整个正弦周期输出 我只是把那个正弦数据抬高了 这样就可以把负数那一部分变成正数 然后除以2 至于你说的那个pid 我还没做 我只做了spwm输出 从单片机管角输出spwm 我所不能理解的是从示波器测出来那个波周期和频率都在变 那个pwm的输出周期和频率不是固定的吗 为什么还在变 可能我基础差吧 这个不能理解
tianxj001 2017-10-05
  • 打赏
  • 举报
回复
程序里面如果不是用查表,而是计算活动SPWM值,一般采用的是泰勒展开式,必须是多次迭代的浮点乘法运算,因此想获得合适精度(int)计算量很大,代码开销也不少,因此采用SIN表,像上面例子,我们只需要200 int存储单元,就代码的总大小来说,也不会不合算。而且,通过同步改变TIM1_ARR 的值和程序SPWM中值,再对sin数据表进行1440和实际数的比例乘除,也可以实现完美的变频控制,而不需要用实时计算sin值来写程序,缺点是载波会随着交流电频率的变化正比而变化,这个在频率变化范围比较小时候,就完全不是什么问题了比如设计30KHZ--20KHZ频率范围作为载波,那么你的变频正弦波范围也就有60--40HZ范围,对于逆变器应该完全够用了。
tianxj001 2017-10-05
  • 打赏
  • 举报
回复
好像楼上还没有深刻理解,不过不重要,你把32芯片配置好,程序弄对,按照我提供的方法,程序里面有正确的SIN数据表,然后假设一个恒定的PID校正值为0.8,TIM1_CCR1=720+sin_tab[i]*0.8然后直接运行程序,你应该能得到互补的SPWM波形了,用任意一路的输出PWM端口,然后用RC低通滤波环节,你应该可以测量到稳定完美的50HZ正弦波。然后你修改0.8这个PID校正值,就可以对得到的50Hz正弦波进行幅度控制。该数值最大应该限制在小于1,比如0.99。
glsgxh 2017-10-05
  • 打赏
  • 举报
回复
这个不支持图片上传还是算了
glsgxh 2017-10-05
  • 打赏
  • 举报
回复
spwm是这样的吗?这个是直接从单片机管角测的的 没有经过滤波的硬件电路 但是那个周期一直在变不知道为什么
tianxj001 2017-10-04
  • 打赏
  • 举报
回复
首先,如果取200个采样,那么你的基频应该是200*50Hz=10KHz,这个会落在音频范围,当然,你可以采用超采样的方法,也就是PWM周期还是20KHz,只是每2个中断修改一次数字比较器数值,这样精度稍微低点到也可以。 为了芯片有足够的时间资源干别的事情,对于SPWM数据,并不建议用计算方法,除非你要做线性变频系统,否则就用查表最经济,同时数据精度也是最高。 固定频率的,详细给你解析一下: 72MHz时钟,TIM1,用一个通道比如就通道1,MODE=PWM1,TIM1_ARR为1440,开启互补输出,设置合适的死区一般300ns就够。比较器初始值=720,开比较中断。 PWM数据表里面是一系列你通过计算得到的正弦波数据,在每次比较输出时候,查表获得正弦波数据,为了输出稳压,一般我们必须有一个输出整流积分后取得一个直流采样数据,经过分压,返回到ADC,作为输出正弦波电压的测量数据,然后和我们设置的目标数据进行PID运算,获得一个小于1的PID结果,然后查表的正弦波数据*PID就是我们可以送出的SPWM数据,直接送TIM1的比较寄存器。 下面是正弦波表格:由于极性和零值都是我们可以控制的,所以,其实我们只需要存储半个周期数据就可以,这个表数据是这样获得的sin_tab[]=720*sin(π*i/400)....(i=0--199),为了省力,我们可以在excel表格里面利用自动计算功能,直接获得该数据。 很明显,现在sin_tab[i]里面是一系列0---720的正弦波数据,i=中断计数,SPWM数据在前200个中断计数间,为正极性,也就是TIM1_CCR1=720+sin_tab[i]*PID结果,后200个数据为负极性,也就是TIM1_CCR1=720-sin_tab[i]*PID结果。 由于是tim中断是比较相等事件的中断,该时刻刷新比较数据,只能改变下次比较结果,而这2次的时间间隔基本等于我们tim1的周期,因此我们完全不需要担心这些计算、数据传输刷新等程序所占用的时间,肯定足够了。
glsgxh 2017-10-03
  • 打赏
  • 举报
回复
不是很明白 但是如果说要解调出50hz的正弦波 对于主频为72M的stm32 如果把定时器1做pwm输出定时器2做中断给占空比的话 因为50hz正弦波周期为20ms 如果取200个点 平均每100us中断给一次占空比 所以定时器2的中断的频率为200×50也就是50000hz 也就是把20ms分成200份每一份是100us 定时器2的中断周期为100us 所以可以给定时器2预预装载值给7199 预分频值给0 而每个点的采样都需要一个pwm周期 那定时器1输出pwm的预装载值可以给7199 预分频值给0 也就是和定时器2中断周期是一样的 这样理解是对的吗?还有就是那个spwm数组可以这样算吗spwm=Arr÷2×(1+sin(2×pai×f×t)) Arr是定时器1的预装载值 f是调制出的正弦波的频率 变量t可以以2×pai÷200为基数 用c语言做循环 t=t+2×pai÷200 一直加到2×pai÷200 然后得到200个数 这样对吗?
glsgxh 2017-10-03
  • 打赏
  • 举报
回复
楼主可以尽量给回复吗?急求!!!
tianxj001 2017-10-03
  • 打赏
  • 举报
回复
逆变的stm32产生的那个spwm,一般我们是用一个数据表,数据内部就是一个周期的正弦波数据。设计过程如下: 假定我们设计的PWM的基频为20KHz,那么采样率就为20K/50=400,也就是我们需要在数据表内部保存400个正弦波数据。 然后就再根据PWM基频,设计TIM的时钟,比如时钟就是72MHz,那么周期重载数据为72MHz/20KHz=1440。 现在我们就知道,正弦波表就在0-1440之间,0对应正弦波的-1,720对应正弦波的0,1440对应正弦波的1。这个数据就是TIM的占空比比较器实时数据。 具体输出时候,在TIM周期中断函数里,我们根据中断计数(400重复)查表,再根据PID输出数据,输入小于1的浮点数据和查表数据相乘,就可以获得实时输出的SPWM控制数据。

27,375

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧