1.OpenPWM() ;和ClosePWM();的解析:
在
void
HVDMC_Protection(
void
)中,
最后一步
// Clear any spurious OV trip
EPwm1Regs.TZCLR.bit.OST = 1;
此处在软件层面,清除TZ的中断标志位,为了检测新的错误的产生
void ClosePWM(void)
{
EALLOW;
EPwm1Regs.TZFRC.bit.OST=1;
EDIS;
}
此处用软件强制给中断标志位赋值,来使系统产生中断,从而关闭PWM。
问题:为什么要先清除标志位,然后再赋值来关断PWM?
clarke1.As = _IQmpy((_IQmpy2(_IQ14toIQ(AdcMirror.ADCRESULT0+AdcMirror.ADCRESULT1+AdcMirror.ADCRESULT2+AdcMirror.ADCRESULT3)-offsetA)),_IQ(0.9090909*2.0));
clarke1.Bs = _IQmpy((_IQmpy2(_IQ14toIQ(AdcMirror.ADCRESULT4+AdcMirror.ADCRESULT5+AdcMirror.ADCRESULT6+AdcMirror.ADCRESULT7)-offsetB)),_IQ(0.9090909*2.0));
//12bit AD 看做Q12格式,4个12bit AD结果相加,看做Q14格式,相当于除以4
offsetA =_IQmpy(K1,offsetA) +_IQmpy(K2,_IQ14toIQ(AdcMirror.ADCRESULT0+AdcMirror.ADCRESULT1+AdcMirror.ADCRESULT2+AdcMirror.ADCRESULT3));
_IQ14toIQ:全局IQ等于24,为什么这里的IQ是等于12? 由于ADC的分辨率只有12位,所以此结果的寄存器高12位是有效的(此处只保留了高12位?)
1.clarke变换中的取值范围
而下面这段,是得到IU和IV
#ifdef DSP2833x_DEVICE_H
clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; // Phase A curr.
clarke1.Bs=((AdcMirror.ADCRESULT2)*0.00024414-offsetB)*2*0.909; // Phase B curr.
#endif // ((ADCmeas(q12)/2^12)-offset)*2*(3.0/3.3)
至于楼主问的3.0/3.3),是这样的:
基于同一个开发板,TI 提供了F2803X和F2833X的例程,而F2803X的ADC量程是3.3V,而F2833X的量程是3.0V,但在“HVPM_Sensorless-Settings.h”中BASE_CURRENT是针对ADC输入脚为3.3V时的最大电流,因此在用F2833X的时候要乘以(3.0/3.3)这个比例系数。
来源: http://www.deyisupport.com/question_answer/microcontrollers/c2000/f/56/p/13402/80623.aspx
clarke1.As = _IQmpy2(_IQ12toIQ(AdcResult.ADCRESULT1)-offsetA); // Phase A curr.
AdcResult.ADCRESULT1是12位的AD,范围是0~4096,_IQ12toIQ,此处GLOBAL_Q=24,所以相当于除以4096(2^12),AdcResult.ADCRESULT1此时的范围是(0-1),在减去偏移offsetA=0.5,范围就是(-0.5-0.5)
clarke1.As=((AdcMirror.ADCRESULT1)*0.00024414-offsetA)*2*0.909; // Phase A curr.
这个*0.00024414的表示方法相当于除以12,
(AdcMirror.ADCRESULT1)*0.00024414-offsetA出来的范围是(-0.5-0.5),乘以2,范围变成(-1-1)!!乘以0.909的原理如上。
2.
UgPU = _IQmpy(_IQ12toIQ(AdcMirror.ADCRESULT8)- offsetIg,_IQ(6.384922)); //标幺值为180V
IgPU = _IQmpy(_IQ12toIQ(AdcMirror.ADCRESULT9)- offsetIg,_IQ(1.8181818)); //标幺值为25A
UdcPU= _IQmpy(_IQ12toIQ(AdcMirror.ADCRESULT10),_IQ(6.8)); //标幺值为180V
怎么进行标幺的?
__IQmpy(((long) (AdcMirror.ADCRESULT8) << (24 - 12))- offsetIg,(long) ((6.384922) * 16777216.0L),24)
#define _IQ20toIQ(A) ((long) (A) << (GLOBAL_Q - 20)) 此处转移的是小数点的位置?
if(UdcPU > _IQ(1.33))//如果母线电压大于240V,转子回零标志置位
Debug 通常称为调试版本,它包含调试信息,并且不作任何优化,便于程序员调试程序。
Release 称为发布版本,它往往是进行了各种优化,使得程序在代码大小和运行速度上都是最优的,以便用户很好地使用。
电动机软起动是通过采用降压、补偿或变频等技术手段,实现电动机及机械负载的平滑起动,减少起动电流对电网的影响程度,使电网和机械系统得以保护。\
http://blog.sina.com.cn/s/blog_b3e232680102x5x1.html
https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/t/99766
https://e2echina.ti.com/question_answer/microcontrollers/c2000/f/56/p/13402/80623#pi239031350=2