0
点赞
收藏
分享

微信扫一扫

FOC(基于DSP28335)-旋变位置传感器(AD2S1205)

开源分享 2022-04-25 阅读 180
c语言

由于安装误差,旋变位置传感器零位与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;

}

举报

相关推荐

0 条评论