最近在做单片机的子项目,经过近半个月的安装调试,第一阶段顺利完成了。只能说第一次做这种小工程确实缺乏经验,跟书本上学的还是有些出入。做下记录,方便后面来查看。
0. 实验要求
基于STM32单片机,使用AD2S1210旋变芯片读取电机转子位置和速度。
硬件设施:STM32F103C8T6、TPS5430、AD2S1210、RS422、Kingst Logic Analyzer、TDS220示波器。
1. 硬件平台搭建
旋变芯片5V供电,采用电平转换芯片28v转5v。串口传输用串口转422或者串口转USB均可。
实验环境
2. AD2S1210芯片
产品特性:
- AD2S1210是一款10位至16位分辨率旋变数字转换器,集成片上可编程正弦波振荡器,为旋变器提供正弦波激励。
- 具备功能:绝对位置与速度输出,最大跟踪速率: 3125 rps(10位分辨率),系统故障检测,兼容DSP和SPI接口标准。
- 应用场景:直流和交流伺服电机控制,编码器仿真,电动助力转向,电动汽车,集成的启动发电机/交流发电机,汽车运动检测与控制。
根据芯片说明书要求,有几点需要注意:
跟踪速率与分辨率关系
RESET复位
初始时先低电平复位,随后恢复高电平。
串行接口时的说明
CS接口保持低电平,数据上升沿移出,下降沿移入,SCK空闲时高电平。
串行接口时序图
这种芯片的时序图比较奇怪,spi通信开始时,先SCK低电平再WR低电平,结束时,先WR高电平再SCK高电平,感觉是SPI模式2的变形,跟常规的时序图不太一样,还有就是读写数据要分开通信,如果是同时交换数据那种结果就不对(在这调试了很久)
3. keil编程
采用软件SPI通讯,读写数据分开。
AD2S1210.c
main.c
先配置寄存器,然后读一遍出来看写进去没有,最后读位置和速度寄存器。
4. 实验现象
1. 串口数据
前十个是配置寄存器信息,第十一个是故障信息,最后四个是位置和速度数据。速度最高位为方向,0正转,1反转。
经过测试,位置和速度数据正常,10位分辨率,忽略后6位。
顺便说一下,故障信息显示的是0x10,对应错误是正弦/余弦输入超过DOS失配阈值,这我查了一下网站,据说是“造成这种故障一般是SIN/COS信号存在干扰,可以调整下滤波器参数或者提高系统抗干扰能力”。所以看来是外部干扰影响的,这种故障信息不会影响位置和速度读取,无伤大雅。
2. 示波器读激励频率
我设置的激励频率是15KHz,但是示波器读出频率18.35KHz,感觉很疑惑,因为根据我设置的参数反推回去芯片CLK频率应该是9.830MHz,这跟芯片的8.192MHz有点出入,然后我又仔细看了一遍说明书,芯片时钟频率是在8.192±25%的范围之内,所以激励频率有出入是正常的。
3. 逻辑分析仪读时序
根据时序仪显示,时序图和芯片说明书的时序图一致,满足要求,所以读写数据是正确的。
5. 总结
- 配置好寄存器之后,读一遍配置寄存器数据即可,不能重复读配置寄存器数据,重复读会数据不一致
- SPI读写分开,先写再读
- 芯片说明书要认真阅读,尤其是时序图,还有就是注意上升沿和下降沿的时间延时。
- 延时纳秒 delay(0x01): 500ns,delay(0x0f): 2.84us,delay(0xff): 10.84us,>>=1: 100ns。
6. 后续
用AD698芯片读转子位置和速度,加强验证。