如何使用dsPIC30F2010芯片,采用等面积算法,写出单极性的SPWM程序?
如何使用dsPIC30F2010芯片,采用等面积算法,写出单极性的SPWM程序?数据表做好后,如果每个PWM中断的时候装入新的占空比,则发现会丢失数据,不知哪位高人
有这类程序. 使用简单PWM 模式
当控制位OCM<2:0>(OCxCON<2:0>)= 110 或111
时,所选输出比较通道被配置为PWM 工作模式。 当配
置为PWM 工作模式时, OCxR 是主锁存器(只读),
OCxRS 是辅助锁存器。 这能使PWM 电平跳变时不会
产生毛刺。 请问hustjoybo先生,您用的是PIC30F2010吗?我写SPWM的时候,怎么没用到你说的控制位OCM<2:0>和OCxR等.能具体指导我吗? 上面的朋友可能没有用2010,不知道你说的中断里改写占空比丢失数据是什么意思。。。 ville您好.
我的数组表格里共有100个数据,也就是脉冲宽度值,我是在PWM中断程序里进行占空比更新的,但是每次数组的前面几个值
都会丢失.也就是说每个周期应该有100个脉冲,但是实际上总是缺少几个脉冲.
不知道您写过这类程序吗,能否帮我找找毛病.要不您把EMAIL告诉我,我把程序给您发过去,您帮我调试一下.程序很简单
只有几行. 回复【4楼】progsister
-----------------------------------------------------------------------
可能是你的中断没有响应过来, 这个要看你的PWM的频率,另外就是如果记得正弦表直接就是占空比数值的话,那么在中断里面只需要直接象占空比寄存器赋值就可以了,这样不需要花费多少系统周期。如果你还需要用到PWM的周期和正弦表相乘计算占空比那么在频率比较高的情况下确实会出现来不及响应的情况。 我在中断程序里没有进行计算,只是简单的赋值.,既然响应不过来,那怎么修改程序呢?请 tiancaigao7 天才杨威利指点一下好吗? 也有可能是驱动能力不足或者负载电容引起的
把PWM的频率改低试试 这是之前用2020写的单极性倍频逆变程序,不过这芯片真不怎么样,热的要死。换33F凉快好多啊。
另外30F2010的电机PWM模块,死区在占空比为0的时候也出死区,这个谁解决过,传授下经验啊!
void pwm_init()
{
PTCON=0x2801;//暂时关闭PWM,允许特殊事件中断,无外部同步源,特殊初始每触发2次就中断一次(用于更新占空比用)
PTPER=Period_Def;//20KHzPWM,周期时间=(PTPER+1)/120MHz;50uS=(PTPER+1)*8.33nS;PTPER=6000;另外由于PTPER最低3位是0.所以左移3位
SEVTCMP=38000;//特殊事件触发时间设置为当次周期结束前6uS时触发
MDC=0x0010;//占空比最小值是16
IPC4bits.PSEMIP=6;//暂时设置PWM特殊事件中断优先级为6(第二级)
IEC1bits.PSEMIE=0;//暂时屏蔽PWM特殊事件中断
IFS1bits.PSEMIF=0;//清除中断标志位
//PWM1
PDC1=0x0010;
//PWMCON1=0xC00;//允许中断触发,允许过流保护中断,主时基提供时间,使用PDC1独立占空比
PWMCON1=0x0000;//禁止故障中断,正死区
DTR1=0x1ea;//死区250nS
ALTDTR1=0x1ea;//双死区时间,上升沿死去时间和下降沿死区时间相等
//IOCON1=0xD000;//PWM模块控制H,L控制脚,互补输出模式,如果发生限流中断则CLDAT1:CLDAT0分别为H:L提供占空比,2位都设置为0,相当于输出低电平
IOCON1=0xc000;//互补,无故障
//FCLCON1=0x10E3;//共享故障1,低电平有效,使能限流故障。禁止故障控制
TRIG1=0x0000;//PWM1触发中断,暂时禁止触发中断,用于触发AD采样用
LEBCON1=0x0000;//不使用前沿消隐功能
IEC1bits.PWM1IE=0;//禁止PWM1触发中断,只使用其启动AD转换
IFS1bits.PWM1IF=0;
//PWM2
PDC2=0x0010;
//PWMCON2=0x800;//禁止中断触发,允许过流保护中断,主时基提供时间,使用PDC2独立占空比
PWMCON2=0x0000;
DTR2=0x1ea;//死区200nS
ALTDTR2=0x1ea;//双死区时间,上升沿死去时间和下降沿死区时间相等
//IOCON2=0xD000;//PWM模块控制H,L控制脚,互补输出模式,如果发生限流中断则CLDAT1:CLDAT0分别为H:L提供占空比,2位都设置为0,相当于输出低电平
IOCON2=0xc000;
//FCLCON2=0x10E3;//共享故障1,低电平有效,使能限流故障。禁止故障控制
TRIG2=0x0000;//PWM2不触发中断,次中断与PWM采样中断无关
LEBCON2=0x0000;//不使用前沿消隐功能
}
void __attribute__((__interrupt__,auto_psv)) _PWMSpEventMatchInterrupt()//PWM特殊中断,用于更新占空比
{
register int result asm("A");//定义一个变量指向DSP累加器A
IFS1bits.PSEMIF=0;
//这里查遍程序,查完后计算
//这里计算占空比,赋给Duty_Gain_A和Duty_Gain_B
Duty_Gain_A<<=3;
Duty_Gain_B<<=3;
if(Duty_Gain_A<0x0010)//如果小于限制值
{
Duty_Gain_A=0x0010;
}
if(Duty_Gain_B<0x0010)
{
Duty_Gain_B=0x0010;
}
PDC1=Duty_Gain_A;
PDC2=Duty_Gain_B;
} liansh ,谢谢,不过芯片不一样,很难读懂,另外,能介绍一下程序的思路吗? 回复【9楼】liansh
-----------------------------------------------------------------------
你好在吗?不知道你的单极性倍频的SPWM数据是用那个公式生成的,有点看不懂,请指教一下 使用简单PWM 模式
当控制位OCM<2:0>(OCxCON<2:0>)= 110 或111
时,所选输出比较通道被配置为PWM 工作模式。 当配
置为PWM 工作模式时, OCxR 是主锁存器(只读),
OCxRS 是辅助锁存器。 这能使PWM 电平跳变时不会
产生毛刺。 liansh 发表于 2011-4-11 11:32 static/image/common/back.gif
这是之前用2020写的单极性倍频逆变程序,不过这芯片真不怎么样,热的要死。换33F凉快好多啊。
另外30F2010的 ...
哥们,你换的33的片子是什么型号,我也受不了30系列的了 太热了 hongjie0216 发表于 2012-9-13 07:54 static/image/common/back.gif
哥们,你换的33的片子是什么型号,我也受不了30系列的了 太热了
问下,你会用dspic30f3011的spwm么?我都弄了一个星期了,输出的spwm波有问题?如果你有会的话,可以附上程序么?感谢…… 好帖,顶起! 灵隐桃庵 发表于 2013-6-2 18:22
问下,你会用dspic30f3011的spwm么?我都弄了一个星期了,输出的spwm波有问题?如果你有会的话,可以附上 ...
我刚接触这个芯片,也是要产生spwm,没搞明白,有高人吗?帮忙讲讲
页:
[1]