项目场景:
电机旋变硬件解码芯片使用记录
硬件配置:
1、电机内部励磁线圈如下图示,励磁转子也存在极对数,注意区分,且极对数同电机极对数有有一定的比例关系。

下面就是啃手册了,这是一个嵌入式工程师的家常便饭了。。。。。。。
2、硬件注意事项,根据手册硬件波形调理电路需满足如下条件,调节放大增益来实现。需要硬件外围电路支持,将励磁激励的输出电压去放在合适的电压范围内,可以预防报错,影响使用即获得的结果。
公司的产品用的旋转变压器励磁激励是10KHz,即AD2S1210的输出激励EXC配置为10K。
为节约端口,设计采用SPI通讯的方式来实现。这里采用的是12位的分辨率。即如下所示。
且在软件中需要将地址0X92寄存器的分辨率对应写上。
如下,按照寄存器进行配置即可。
软件设计:
1、这里使用的是STM32G4系列的单片机进行的SPI通讯设计。系统时钟位170MHz,图形化配置如下:
需要注意的就是SPI的极性配置这里CPOL=0,CPHA=1。
废话不多说了上代码。
(1)基础配置
//Register Map
#define POSITIONMSB 0x80
#define POSITIONLSB 0x81
#define VELOCITYMSB 0x82
#define VELOCITYLSB 0x83
#define LOSTHRES 0x88
#define DOSORTHRES 0x89
#define DOSMISTHRES 0x8A
#define DOSRSTMXTHRES 0x8B
#define DOSRSTMITHRES 0x8C
#define LOTHITHRES 0x8D
#define LOTLOTHRES 0x8E
#define EXFREQUENCY 0x91
#define CONTROL 0x92
#define SOFTRESET 0xF0
#define FAULT 0xFF
#define POS_VEL 0x00
//复位
#define RESET_H HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_SET)
#define RESET_L HAL_GPIO_WritePin(GPIOE,GPIO_PIN_15,GPIO_PIN_RESET)
//CS片选
#define PCS_H HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_SET)
#define PCS_L HAL_GPIO_WritePin(GPIOA,GPIO_PIN_15,GPIO_PIN_RESET)
//边沿触发逻辑输入
#define NWR_H HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_SET)
#define NWR_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_2,GPIO_PIN_RESET)
//采样
#define SMAPLE_H HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_SET)
#define SMAPLE_L HAL_GPIO_WritePin(GPIOB,GPIO_PIN_10,GPIO_PIN_RESET)
//故障读取
#define DOS HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_11)
#define LOT HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_9)
//模式切换
#define A0_H HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1,GPIO_PIN_SET)
#define A0_L HAL_GPIO_WritePin(GPIOD,GPIO_PIN_1,GPIO_PIN_RESET)
#define A1_H HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_SET)
#define A1_L HAL_GPIO_WritePin(GPIOD,GPIO_PIN_2,GPIO_PIN_RESET)
//分辨率配置
#define RES0_H HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_SET)
#define RES0_L HAL_GPIO_WritePin(GPIOC,GPIO_PIN_13,GPIO_PIN_RESET)
#define RES1_H HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_SET)
#define RES1_L HAL_GPIO_WritePin(GPIOC,GPIO_PIN_14,GPIO_PIN_RESET)
(2)SPI数据处理
void AD2S2S1210_ModeCfg(uint8_t ModeConfig)
{
//Ax配置
switch(ModeConfig)
{
case Mode_POSIT:
A0_L;A1_L;
break;
case Mode_SPEED:
A0_L;A1_H;
break;
case Mode_COFIG:
A0_H;A1_H;
break;
default:
A0_H;A1_H;
break;
}
AD2S1210_Delay(4);
SMAPLE_H;
AD2S1210_Delay(1);
SMAPLE_L;
AD2S1210_Delay(1);
}
void AD2S1210_Init()
{
//电阻配置
RES0_L;RES1_H; //配置为12位
A0_H;A1_H; //配置模式
PCS_L;
SMAPLE_L;
AD2S1210_WRITE(CONTROL,0x7A); //控制寄存器配置,主要配置分辨率
AD2S1210_WRITE(EXFREQUENCY,0X28); //设置ESC驱动频率 250 * 40 =10KHz
AD2S1210_WRITE(DOSRSTMXTHRES,0x7e); //DOS复位最大阈值
AD2S1210_WRITE(DOSRSTMITHRES,0x02); //DOS复位最小阈值
AD2S1210_WRITE(LOSTHRES,0x01); //复位最小阈值
AD2S1210_WRITE(DOSORTHRES,0x7f); //DOS超量程阀值
AD2S1210_WRITE(DOSMISTHRES,0x7f); //DOS失配阀值
AD2S1210_Delay(0xfff);
SMAPLE_H;
SMAPLE_L;
AD2S1210_Delay(0x1ff);
AD2S1210_REFAULT(); //复位错误
AD2S1210_Delay(0xff);
PCS_H; 仅有片选功能
}
//AD2S1210 硬件复位
void AD2S1210_RESET(void)
{
SMAPLE_H;
SMAPLE_L;
RESET_L;
AD2S1210_Delay(0x5ff);
RESET_H;
AD2S1210_Delay(0xff);
}
//AD2S1210复位错误----3us
void AD2S1210_REFAULT()
{
AD2S2S1210_ModeCfg(Mode_COFIG);
SMAPLE_H;
AD2S1210_Delay(0x1);
SMAPLE_L;
AD2S1210_Delay(0x1);
AD2S1210_READ(0xFF);
SMAPLE_H;
AD2S1210_Delay(0x1);
SMAPLE_L;
AD2S1210_Delay(6);
}
void AD2S1210_Delay(uint32_t nCount) //nCount =1时 执行时间为183ns 步长22ns
{
for(; nCount != 0; nCount--);
}
//写入
void AD2S1210_WRITE(uint8_t addr,uint8_t data)
{
uint8_t temp =addr;
uint8_t rData=0;
NWR_L;
AD2S1210_Delay(1);
HAL_SPI_TransmitReceive(&hspi3,&temp,&rData,1);
NWR_H;
AD2S1210_Delay(0x06);
NWR_L;
AD2S1210_Delay(1);
temp = data;
HAL_SPI_TransmitReceive(&hspi3,&temp,&rData,1);
NWR_H;
AD2S1210_Delay(0x20);
}
//配置模式读取
uint8_t AD2S1210_READ(uint8_t addr)
{
uint8_t temp=addr;
uint8_t buff=0;
uint8_t temp2;
NWR_L;
AD2S1210_Delay(0x01);
HAL_SPI_Transmit(&hspi3,&temp,1,1);
NWR_H;
AD2S1210_Delay(0x02);
buff=0;
NWR_L;
temp2 = HAL_SPI_TransmitReceive(&hspi3,&temp,&buff,1,1);
NWR_H;
AD2S1210_Delay(0x2);
return temp2;
}
//普通模式读取
uint16_t AD2S1210_CommRead(uint8_t *err)
{
unsigned char tbuff[3]={0xFF,0xFF,0xFF};
unsigned char rbuff[3];
NWR_L;
AD2S1210_Delay(1);
HAL_SPI_Receive(&hspi3,buff,3,2);
NWR_H;
AD2S1210_Delay(1);
*err = rbuff[2];
return ((rbuff[0]<<8)+rbuff[1]);
}
如上所所示,即位驱动程序的全部,在可靠性验证时,可以切换模式,如500ms配置为配置模式,读取写入的参数,另500ms配置为只读模式,读取位置/速度和故障信息,验证通讯的可靠性。
自然也可以使用DMA进行配置AD2S1210的读取方式,暂未研究透彻,不在赘述。
参考
可参考其手册,高亮出为使用时的注意事项。