X
首页
技术
模拟电子
单片机
半导体
电源管理
嵌入式
传感器
最能打国产芯
应用
汽车电子
工业控制
家用电子
手机便携
安防电子
医疗电子
网络通信
测试测量
物联网
最能打国产芯
大学堂
首页
直播
专题
TI 培训
论坛
汽车电子
国产芯片
电机驱动控制
电源技术
单片机
模拟电子
PCB设计
电子竞赛
DIY/开源
嵌入式系统
医疗电子
颁奖专区
【厂商专区】
【电子技术】
【创意与实践】
【行业应用】
【休息一下】
最能打国产芯
活动中心
直播
发现活动
颁奖区
电子头条
参考设计
下载中心
分类资源
文集
排行榜
电路图
Datasheet
最能打国产芯
单片机
[求助] Spwm波形输出幅值不一样
junl1989
2016-9-23 17:32
楼主
利用STM32F4,高级定时器产生的三路SPWM。具体思路:对一个正弦波周期进行预采样,采样点数是12个点(SinePoint),既30度一个点。然后f(x) = N/2 + N/2-1 * sin(2πx/N) x∈[0…N-1],有这个公式取表格,N就是我量化的量,我取的32768,生成了12个数据表格。载波频率我设置了 Fp=15Khz,TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; 调制波的频率想在5-250hz之间可调的,所以设置了参数Fs。对于每一频率的正弦波调制波则对应的载波比就是Fp/Fs = N ,也就是说N个PWM波调制一个周期的正弦波,而又一个正弦波我只采样了12个点,所以在这N个波形里,采样x点与采样x+1点之间的PWM个说就是N/12 ,因为x点与x+1点有多个PWM波,所以我会在x点与x+1点插入差值,使得PWM占空比不会突变的太多,插入方法是计算x与x+1点的差值,然后差值/两点之间PWM的个数,该值就是平均值了,既我每次PWM中断,占空比对应上一次的PWM中断所增加的量。
代码:
const int SPsinetable[] =
{
//采样数 12 , 30度一个点 N = 32768
//f(x) = N/2 + N/2-1 * sin(2πx/N) x∈[0…N-1]
0x4000,0x6000,0x776C,0x7FFF,
0x776C,0x6000,0x4000,0x2001,
0x0894,0x0001,0x0894,0x2000
};
t1 = SPsinetable[angle1%SinePoint] ; //A相
t2 = SPsinetable[(angle1+SinePoint/3 )% SinePoint] ; //B相,120度
t3 = SPsinetable[(angle1+SinePoint*2/3)% SinePoint] ;//C相 240度
if(SPsinetable[angle1%SinePoint] > SPsinetable[(angle1+1)%SinePoint]) //A相,判断当前采样点与下一个采样点的大小,决定占空比是加还是减
{
CompareTwo = SPsinetable[angle1%SinePoint] - SPsinetable[(angle1+1)%SinePoint] ; //计算与下一个采样点的差值
AveTwo = ((long)CompareTwo * (long)Addflag + (float)PhasePoint*0.5 )/ (PhasePoint+1); //插入平均值,四舍五入,Addflag:比如10次,差度是10,每次就是1,第一次+1*1,第二次+2*1,第三次+3*1
t1 -= (uint16_t)AveTwo ; //计算周期占空比增量
}
else
{
CompareTwo = SPsinetable[(angle1+1)%SinePoint] - SPsinetable[angle1%SinePoint] ;
AveTwo = ((long)CompareTwo * (long)Addflag + (float)PhasePoint*0.5 )/ (PhasePoint+1);
t1 += (uint16_t)AveTwo;
}
//B C相同理计算,省空间就不列了
Addflag ++ ;
t1 = tpwm * t1 >> 15 ; //占空比计算,>>15是因为之前的量化了10的15次方
t2 = tpwm * t2 >> 15 ;
t3 = tpwm * t3 >> 15 ;
PWM中断程序: if(TIM_GetFlagStatus(TIM1, TIM_FLAG_Update) == SET)
{
if(Spwm_R_Flag) //开启标志
{
if(PwmTimes > PhasePoint) //每个采样点之间的脉冲计数
{
PwmTimes = 0 ;
Addflag = 0 ;
if(AngleR > (SinePoint-1)) AngleR = 0 ; //采样完成一个周期,进行下一个周期
AngleR ++ ; //取下一个采样点
}
SVMR(RefSpeedR, AngleR); //RefSpeedR,与此无关,忽略SVMR()就是占空比计算函数
PwmTimes ++ ;
}
}
以上就是我的SPWM的主要思路,目前情况是输出的波形经过RC滤波出来的波形 调制波频率越大,幅值却越小(见图)。
玩电子的这个圈子太小了,昨天发在另外论坛的都没人回复
,希望这里能找到答案~
点赞
回复评论 (6)
沙发
小涩涩asd
这跟你的滤波参数也有关
点赞
2016-9-23 17:40
板凳
maychang
“输出的波形经过RC滤波出来的波形 调制波频率越大,幅值却越小”
当然!
否则,怎么能够叫低通滤波呢?
点赞
2016-9-23 17:45
4楼
elvike
你的思路错了,你想改变输出电压幅值,要改变的是pwm的发波系数
作为一个水军,就是尽量的多回帖,因为懂的技术少,所以回帖水分大,见谅! EEWORLD开发板置换群:309018200,——电工们免费装β的天堂,商家勿入!加群暗号:喵
点赞
2016-9-24 00:23
5楼
junl1989
换了一个电容,我输出检测的方法是 :
A相输出------R(3.8K)-------R(8.2K)----------
|
B相输出------R(3.8K)-------R(8.2K)--------O点
|
C相输出------R(3.8K)-------R(8.2K)----------
同时在R8.2K电阻处并联了一个电容,106的。。我把这个电容换成了104,居然幅值上去了~~~
...
点赞
2016-9-24 09:27
6楼
z1996
引用:
junl1989 发表于 2016-9-24 09:27
换了一个电容,我输出检测的方法是 :
A相输出------R(3.8K)-------R(8.2K)----------
...
上到原幅值了吗?
点赞
2017-7-17 12:44
7楼
huo_hu
是滤波的问题,再高就畸变必然的
点赞
2017-7-18 10:42
最新活动
报名直播赢【双肩包、京东卡、水杯】| 高可靠性IGBT的新选择——安世半导体650V IGBT
30套RV1106 Linux开发板(带摄像头),邀您动手挑战边缘AI~
安世半导体理想二极管与负载开关,保障物联网应用的稳健高效运行
免费申请 | 上百份MPS MIE模块,免费试用还有礼!
PI 电源小课堂|无 DC-DC 变换实现多路高精度输出反激电源
2024 瑞萨电子MCU/MPU工业技术研讨会——深圳、上海站, 火热报名中
随便看看
FLASH会被自动擦除, 有人遇到过类似的问题么?
一款高精度******电流取样电路(仿真)
嵌入式C程序员面试应注意的一些问题
历年电子设计大赛题目集锦
该程序进不了中断,望高手指点
PLD与CPLD电路设计
使用430仿真器时不会看变量的值,新手请大虾们帮忙啊
衰神附体,连炸两天
【STM32F7设计大赛入侵者】进度贴:开启FPU进行图像处理
2006年中国消费电子
新一代液晶開發技術
DRA7xx 评估模块
帮忙完成一个简单的需求分析
再晒 模拟现场应用
请问ccs v5如何安装MSP-FET430UIF驱动?
各位高手怎么查看局部变量的值吗?
MSP430单片机的ADC12模块
【Nucleo深度评测】之一STM32L053低功耗测试
教学视频不播放 , 介绍Value Line系列
领导过来了
电子工程世界版权所有
京B2-20211791
京ICP备10001474号-1
京公网安备 11010802033920号
回复
写回复
收藏
回复