【先楫HPM5361】QEI读取电机SINCOS编码器
[复制链接]
本帖最后由 hitwpc 于 2024-1-20 19:30 编辑
- 正余弦编码器
正余旋编码器的输出模拟信号。驱动器通过AD采集,可以得到当前sinθ和cosθ的幅值,从而可以反正切求出θ值。即细分得到的角度信息。由于模拟采样的正弦波信号是连续的,因此可以实现非常精细的插值,从而实现了很高的位置分辨率。
目前有一个大疆的M3508无刷电机,上面自带的编码器,经过测试之后得到以下线序,从左到右分别是:
使用HPM5361开发板的ADC0_CH4(PB12)和ADC1_CH5(PB13),分别接COS和SIN信号,VCC接3.3V,用于QEI读取正余弦信号,实验装置如下图所示。
用示波器读取了电机的COS和SIN信号,如下图所示,可以看到示波器黄色通道是COS信号,蓝色通道是SIN信号。
|
|
COS信号幅值测量 |
SIN信号幅值测量 |
电机的信号参数如下表所示:
信号类型 |
最小值/V |
最大值/V |
中心值/V |
半波幅值/V |
COS |
0.38 |
1.64 |
1.010 |
0.63 |
SIN |
0.428 |
1.604 |
1.016 |
0.588 |
- QEI的SINCOS模式
设置两个ADC通道分别为ADCx和ADCy,读取COS和SIN信号。经过反正切即可求出目前电机的角度值。当然也可以使用单弦波模式,通过反正弦函数也可以求得角度值。
但是根据上面测试数据可得,实际的SIN和COS信号,信号的中心值和幅值可能不一样,两个信号的相位差异可能也不是严格的90°,那么对电机位置的读取就会出现不准确。HPM5361的QEI也考虑到了这个问题,可以通过ADC_CFG这几个寄存器,实现电机的幅度、中心值和夹角修正。如下图所示。
adcx_cfg0和adcy_cfg0可以指定sin和cos的ADC通道。adcx_cfg2 和adcy_cfg2可以用来设置信号的中心的偏移量,将ADC采集的无符号数转变为有符号值。adcx_cfg1和adcy_cfg1可以设置信号的相位偏移量。最好采用两个ADC分别采样,这样可以保证同一时刻采集到SIN和COS,不会引入相位的差异。
参考的例程信息为:
SDK\sdk_env_v1.3.0\hpm_sdk\samples\drivers\qeiv2\sincos\src
根据以上分析,设置ADCx和ADCy的参数值,电机的电角度和机械角度的比值为7:1,因此设置线数为7.
qeiv2_config_phmax_phparam(APP_QEI_BASE, 7);
通过以下函数读取电机的实时位置信息并打印出来。
z = qeiv2_get_current_count(APP_QEI_BASE,qeiv2_counter_type_z);
ph = qeiv2_get_current_count(APP_QEI_BASE,qeiv2_counter_type_phase);
pos = qeiv2_get_current_count(APP_QEI_BASE,qeiv2_counter_type_speed);
ang = qeiv2_get_current_count(APP_QEI_BASE, qeiv2_counter_type_timer);
3 位置读取实验
WeChat_20240120192716
|