由于安装误差,旋变位置传感器零位与A轴不能完全重合,存在一个固定角度(可能为δ,也可能为δ' )。此时,控制器从旋变位置传感器获得的角度为θ' 或 θ'' 。但是电机控制过程中,真正需要的角度是θ 。图中θ 存在两种情况:
void AD2S1205_Init(void)
{
AD2SXBPare.init_Angle= xxx; // 电机零位
// 旋变安装时候与电机反电动势过零点存在绝对相差角度是零位值
Delay_ms(5); // 硬件电平SOE高电平并行,FS12高电平,励磁10KHZ
XB_NRST_OFF; // AD2S1205需要一个外部复位信号使RESET复位信号保持低电平,直到VDD达到规定的工作电压范围
SAMPLE_ON; // SAMPLE保持高电平
DELAY_US(100); // 超过10us的上电复位
XB_NRST_ON;
Delay_ms(30); // 超过20ms的电路稳定时间
SAMPLE_OFF;
Delay_ms(2) ;
SAMPLE_ON; //见手册上电时序控制和复位
}
Uint16 Read_IO_interface(void)
{
Uint16 AD2S_data=0; // 旋转变压器的并口数据12位读取IO 非连续的IO读取状态
AD2S_data=DB_0+(DB_1<<1)+(DB_2<<2)+(DB_3<<3)+(DB_4<<4)+(DB_5<<5)
+(DB_6<<6)+(DB_7<<7)+(DB_8<<8)+(DB_9<<9)+(DB_10<<10)+(DB_11<<11); // 10US
return AD2S_data;
}
void AD2S1205_Read(void)
{
volatile Uint8 AD2Si=0;
Uint8 Fault_DOS=0,Fault_LOT=0;
SAMPLE_OFF;
Delay_100ns(6); // 6/8.192M+20ns=500ns
CS_RD_OFF; //CS和RD保持低电平时,输出缓冲器使能
Delay_100ns(1); // 100ns
RDVEL_ON; //高电平,选择角位置寄存器
AD2Si=1; AD2Si=2; // 停顿延时2个时钟
Delay_100ns(1); // 100ns
AD2SXBPare.AD2S_angle =Read_IO_interface(); // 读取位置信号
// 旋变安装时候与电机反电动势过零点存在绝对相差角度是零位值
AD2SXBPare.PM_angle =(Uint16)(AD2SXBPare.AD2S_angle*Poles_Ratio_Coeff-AD2SXBPare.init_Angle)&(AD2SXB_12Bit);
//转换成12位数据
Delay_100ns(1); // 100ns
RDVEL_OFF; //低电平,选择角速度寄存器
AD2Si=1; AD2Si=2; // 停顿延时2个时钟
Delay_100ns(1); // 100n
CS_RD_ON;
AD2Si=1; AD2Si=2; // 停顿延时2个时钟
Delay_100ns(1); // 100n
CS_RD_OFF;
Delay_100ns(1); // 100ns
AD2SXBPare.AD2S_Spd_RD =Read_IO_interface(); // 读取旋变速度信号值
// 信号数据高第12位是方向信号 0是正转 1是反转负的 所以将数据左移位后,取有符号16数据 即把方向符号取出,然后在右移动4位
AD2SXBPare.AD2S_Spd=((int16)(AD2SXBPare.AD2S_Spd_RD<<4))>>4;
AD2SXBPare.AD2S_SpdRPM=(int16)(AD2SXBPare.AD2S_Spd*((float32)(625/64))); // AD2SXBPare.AD2S_Spd*60000/2048/3 3= 旋转变压器极对数
AD2SXBPare.AD2S_SpdRPMH=AD2SXBPare.AD2S_SpdRPMH*GM_Low_Lass_A + AD2SXBPare.AD2S_SpdRPM*GM_Low_Lass_B; // 转速一阶低通滤波
Fault_DOS=GPIO_DOS;
Fault_LOT=GPIO_LOT;
AD2SXBPare.AD2S_FaultDOSLOT=(Uint8)((Fault_DOS<<1)+Fault_LOT); // 将故障数据处理为2位数据
if(AD2SXBPare.AD2S_SpdRPMH>10) // 判断正反转
AD2SXBPare.Move_State=1;
else if(AD2SXBPare.AD2S_SpdRPMH<-10)
AD2SXBPare.Move_State=2;
else
AD2SXBPare.Move_State=0; // 不在正负10RPM内就认为停机
AD2SXBPare.Abs_SpdRPM=Abs(AD2SXBPare.AD2S_SpdRPMH);
CS_RD_ON;
RDVEL_ON;
SAMPLE_ON;
}