- 2024-04-30
-
回复了主题帖:
共读入围:开关电源仿真与设计--基于SPICE(第2版修订版)
个人信息无误,确认可以完成评测计划。
- 2024-02-04
-
回复了主题帖:
测评颁奖: 国产高性能运动控制MCU 先楫HPM5361
感谢eeworld和先楫半导体,地址信息已更新,可以年前发放
- 2024-01-20
-
发表了主题帖:
【先楫HPM5361】QEI读取电机SINCOS编码器
本帖最后由 hitwpc 于 2024-1-20 19:30 编辑
正余弦编码器
正余旋编码器的输出模拟信号。驱动器通过AD采集,可以得到当前sinθ和cosθ的幅值,从而可以反正切求出θ值。即细分得到的角度信息。由于模拟采样的正弦波信号是连续的,因此可以实现非常精细的插值,从而实现了很高的位置分辨率。
目前有一个大疆的M3508无刷电机,上面自带的编码器,经过测试之后得到以下线序,从左到右分别是:
VCC
SIN
GND
COS
NC
NC
NC
使用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 位置读取实验
[localvideo]6a64fa30f98df5dce98818a0b245c13f[/localvideo]
- 2024-01-19
-
发表了主题帖:
【先楫HPM5361】IIC读取无刷直流电机磁编码器位置
本帖最后由 hitwpc 于 2024-1-19 22:32 编辑
I2C模块介绍
I2C 的主要特性:
● 支持标准模式(100Kb/s),快速模式(400Kb/s) 和快速模式+(1Mb/s)
● 可配置主从模式
● 支持7 位和10 位地址模式
● 支持广播呼叫地址(general call address)
● 自动时钟延展(clock stretching)
● 可配置的时钟/数据时序
● 支持直接内存访问(DMA)
● 4 字节FIFO
有关I2C协议特性,可参考:
IIC原理超详细讲解---值得一看-CSDN博客
AS5600介绍
使用的无刷直流电机,电机出轴上安装了一个径向充磁磁铁,AS5600是一种易于编程的磁性旋转位置传感器,具有高分辨率12位模拟或PWM输出。该非接触系统测量轴上径向磁化磁体的绝对角度。AS5600专为无触点电位器应用而设计,其坚固的设计消除了任何均匀外部杂散磁场的影响。行业标准I²C接口支持非易失性参数的简单用户编程,无需专门的程序员。默认情况下,输出表示0到360度的范围。也可以通过编程零角度(开始位置)和最大角度(停止位置)来定义输出的较小范围。AS5600还配备了智能低功耗模式功能,可自动降低功耗。输入引脚(DIR)选择输出相对于旋转方向的极性。如果DIR接地,输出值随顺时针旋转而增加。如果DIR连接到VDD,则输出值随逆时针旋转而增加。
AS5600是12位的霍尔磁编码器,它的地址是0x36,只需要读取0x0C、0x0D这两个寄存器就可以读出角度的原始数据,再将其乘以360,再除以4096,就可以获得角度值。
例程API介绍测试
参考例程
SDK\sdk_env_v1.3.0\hpm_sdk\samples\drivers\i2c\polling\master\src
使用的是I2C的轮询收发模式,作为主机。例程中还有其他的模式,如中断和DMA收发。
初始化
实验使用的是I2C0,初始化IO引脚,分别是PB02(SCL)、PB03(SDA)。同时设置I2C为标准模式(100Kb/s),采用7位地址。设置IIC频率,完成IIC初始化。
I2C的收发函数
读、写函数
hpm_stat_t i2c_master_read(I2C_Type *ptr, const uint16_t device_address,uint8_t *buf, const uint32_t size)
hpm_stat_t i2c_master_write(I2C_Type *ptr, const uint16_t device_address,uint8_t *buf, const uint32_t size)
形参分别是I2C标号、从机地址、数据指针、数据数量
向指定位置读写数据函数
hpm_stat_t i2c_master_address_read(I2C_Type *ptr, const uint16_t device_address, uint8_t *addr, uint32_t addr_size_in_byte, uint8_t *buf, const uint32_t size_in_byte)
hpm_stat_t i2c_master_address_write(I2C_Type *ptr, const uint16_t device_address, uint8_t *addr, uint32_t addr_size_in_byte, uint8_t *buf, const uint32_t size_in_byte)
形参分别是I2C标号、从机地址、目标写入寄存器,数据指针、数据数量
AS5600 库
可以参考以下驱动库:
libdriver/as5600: AS5600 full function driver library for general MCU and Linux. (github.com)
在/interface目录下添加的IIC总线驱动函数的内容:
uint8_t as5600_interface_iic_read(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
{
//i2c_memory_read(&hi2cx, I2C_MEM_ADDR_WIDIH_8,addr,reg,buf,len,0xFFF);
i2c_master_address_read(HPM_I2C0,addr,®,1,buf, len);
return 0;
}
uint8_t as5600_interface_iic_write(uint8_t addr, uint8_t reg, uint8_t *buf, uint16_t len)
{
i2c_master_address_write(HPM_I2C0,addr,®,1,buf, len);
return 0;
}
在main函数初始化阶段,添加头文件,增加初始化函数:
#include "driver_as5600_basic.h"
as5600_basic_init();
在while中添加读取函数,并用打印出来:
while (1)
{
as5600_basic_read(&angle_1);
printf("%f\n", angle_1);
board_delay_ms(10);
}
测试视频如下:
[localvideo]0bfd691e586a9f75f5a1500d8b9eb3eb[/localvideo]
- 2024-01-16
-
发表了主题帖:
【先楫HPM5361】PWM模块的使用
本帖最后由 hitwpc 于 2024-1-16 23:42 编辑
一、PWM模块介绍
下面是手册中对HPM5361的PWM模块的介绍:
● 28 (24 +4) 位分辨率计数器,支持向上计数模式
● 支持计数器同步
● 多达24 个比较器,支持用作输出比较,或者输入捕获
● 多达24 个通道,其中通道0∼7 可用于PWM 输出
– 支持8 路独立或者4 对互补PWM 输出
– 互补PWM 支持死区插入,支持独立配置双侧死区宽度
– 支持把PWM 输出强制设置为指定状态
– 支持故障保护输入,在出错时(如故障保护输入时),单独配置每个PWM 输出通道的状态
● 支持为每个输出通道灵活地分配数目不等的比较器,灵活控制输出信号,生成例如边沿对齐PWM、左右
不对称的中央对齐PWM 以及更复杂的输出信号
● 支持生成各类DMA 请求和中断请求
● 部分寄存器配有影子寄存器,支持灵活的寄存器新值更新/生效时机
根据介绍,可以看到这颗芯片的PWM模块功能还是很强的,有几个实用的功能:
可调分辨率的计数器,24-28位计数器;
每个PWM模块有8个通道的PWM输出,有24个比较器,每个通道可以设置多个比较器,多个比较器的异或值作为最终的PWM输出电平,因此可以设置出复杂的PWM信号;
两侧可独立编程的死区补偿;
PWM可强制设置制定状态(六步换向);
故障保护功能;
2 例程API介绍测试
2.1 例程介绍
参考例程目录如下:
SDK\sdk_env_v1.3.0\hpm_sdk\samples\drivers\pwm\pwm_output\src
例程中测试了生成了各种PWM
2.2 API介绍
强制输出模式
PWM输出设置为立即更新,将PWM的两个通道设置为强制输出模式;
下面的函数,可以将PWM的两个通道置高或者置低,pwm_output_1为高,pwm_output_0为低。
软件开启/关闭强制输出模式,GCR的SWFRC位置1使能强制输出,置0关闭强制输出
两个通道依次输出一个高电平时间为1S的脉冲,测试图如下:
边沿对齐模式
中心对齐模式1
可以实现单个PWM的中心对齐另外一个PWM的起始
中心对齐模式2
两个互补PWM,中心对齐。下面函数可以实现互补PWM的设置
- 2024-01-14
-
发表了主题帖:
【先楫HPM5361】QEI运动控制接口使用1-ABZ接口使用
1实验硬件基本介绍
1.1电机
使用电机型号未珠海运控60SV04302,编码器为2500线多摩川编码器,同时也可以输出UVW霍尔信号。同时有反相位的信号可以做信号的校验
图1 电机实物图
图2 电机及编码器线序
1.2 QEI介绍
● 支持单相、两相(正交/上下/方向脉冲)、三相(120° 相差)方波输入;
● 支持索引信号INDEX/Z,可产生中断,重置线数计数器,改变圈数计数器
● 支持两个归位信号HOME,仅产生中断
● 支持单相、两相(正交) 正弦波输入(通过ADC 线束)
● 支持正弦波支持幅度/中心值和夹角修正
● 支持线数支持到32 位
● 支持两个预设的位置触发中断,可配置指定的圈数,线数,方向,位置
● 支持软件触发锁存,事件触发锁存,支持两个外部触发锁存(包括圈数,线数,方向,角度,位置)
● 支持两个基于脉冲数的测速计数,测速结果保存两个,记录测速时间
● 支持两个时长的测速计数,测速结果保存两个,记录测速时间
● 支持将位置转换成二进制位置,通过位置线束输出到位置管理器(包含位置获取时间)
● 允许软件修改变位置,线数计数器,圈数计数器(仅支持绝对值方式),允许增量和绝对值方式
● 支持看门狗,支持堵转检测
● 所有中断信号,也可配置产生dma 请求,触发锁存,或触发输出信号
图3 QEI架构框图
本次用于验证ABZ模式下,QEI的测速机制。根据手册介绍,有两种测速的方法:
基于脉冲数量,两次固定脉冲数,读取经过的时间差。类似M法测速
基于时长,两次固定的时间,读取走过的脉冲。类似T法测速
2 例程API介绍测试
2.1 例程介绍
例程目录:
SDK\sdk_env_v1.3.0\hpm_sdk\samples\drivers\qeiv2\abz
在例程中,读取电机编码器AB两相信号,通过固定电机一圈的信号值,求取电机的位置和速度值。
例程说明文档readme目录如下:
SDK\sdk_env_v1.3.0\hpm_sdk\docs\zh\sdk\samples\drivers\qeiv2\abz
2.2初始化设置
函数初始化分别完成板载外设初始化、QEI的AB引脚初始化、QEIV2的参数配置
AB模式下的QEIV2参数配置
设置QEI为ABZ模式,设置AB相输入,相位达到设置的最大值时,Z寄存器自动加减1。设置编码器线数为2500,每组AB脉冲,计数器会产生四个脉冲,每个脉冲90°,因此读取的脉冲值为应该为2500*4,原理下图所示:
设置当Fault输入有效时,停止输出位置有效信号。使能AB相,不使能Z相,上升沿有效。相位比较值设置为2499,开启比较中断。
ABZ模式下的QEIV2参数配置
设置Z相触发Z寄存器加减1,使能Z相
设置脉冲计数和周期计数(选用)
基于脉冲数量,两次固定脉冲数,读取经过的时间差。类似M法测速
基于时长,两次固定的时间,读取走过的脉冲。类似T法测速
初始化QEI
设置Z相初始值为100,光编码器相位为500
3 电机位置信号采集实验
仅打开电机比较中断,打印以下信息:z相次数、相位数、速度、时钟数、相位计数值、位置和角度。
AB信号输入下,实验视频:
[localvideo]0b4a2e78fe35790f60b8ffe43cd5cb2c[/localvideo]
ABZ信号输入下,实验视频:
[localvideo]92d7522e819fd95f563aa0b0a854fb72[/localvideo]
- 2023-12-26
-
回复了主题帖:
【先楫HPM5361】环境搭建及Embedded Studio 的使用
RCSN 发表于 2023-12-25 22:21
建议添加c文件和包含头文件使用cmakelists的sdk_inc和sdk_src添加,你这种方式start_gui重新生成估计又被覆 ...
好嘞,我研究研究。start_gui这个不太理解,生成好工程后还需要再使用start_gui吗?
- 2023-12-25
-
发表了主题帖:
【先楫HPM5361】环境搭建及Embedded Studio 的使用
1环境搭建
1.1硬件电路设置
BOOT引脚设置,BOOT0和BOOT1均选择0;
DEBUG引脚设置,如果需要使用板载的FT2232进行调试的话,需要把图中的3跳线全部接好;如果使用其他调试器,可以用4接口。暂时没有使用Jlinkob等其他调试器尝试,感觉Segger自己的IDE,应该是可以检测出盗版Jlink的。
1.2 建立工程
所有的SDK的例程都在SDK\sdk_env_v1.3.0\hpm_sdk\samples目录下,而且先楫官方提供的两种建立工程的方式,也都是基于这些例程的。下面是两种建立工程的方法:
命令行创建
使用SDK\sdk_env_v1.3.0\start_cmd.cmd,具体方式可参考文件SDK\sdk_env_v1.3.0\docHPM5300EVK_UG_V1.0.pdf的14-18页。实操了一下,感觉不是很方便,推荐使用GUI创建。
GUI创建
使用SDK\sdk_env_v1.3.0\start_gui.exe,按照如下方式设置:
在SDK\sdk_env_v1.3.0\hpm_sdk\samples\hello_world目录下,创建了一个新的工程。
可以通过修改工程放置路径,将工程放在其他位置。但是这种工程建立的方式还是存在问题,生成的工程是依赖于SDK的例程的源码,如果第一次修改工程源码,那么之后再生成工程也会被修改。所以还是创建一个空模板,剩下的文件自己手动添加到工程内吧。
2 软件使用
软件的界面大概是:
编译:
仿真:
使用方法和keil或者基于eclpise的IDE都差不多,下面介绍如何添加其他源文件
将SDK的src下源码文件排除工程,再添加一个新的main.c
(2) 在这里添加一个main.c
(3)这里再添加两个测试文件test1.c、test2.c,在工程目录下的\segger_embedded_studio\Mid\src。
添加路径
打开后可以在下面的定义看到,
$(ProjectDir)=D:/Workspace/emebddstudio/hello_world_hpm5300evk_flash_xip_build/segger_embedded_studio
因此设置路径就不需要再设置绝对路径了
(5)两个.c文件的函数互相调用,再都被main.c调用
再都被main.c引用
(6)编译后,通过
Embedded Studio的一些设置
CTRL+J,呼叫代码补全;
CTRL+K、CTRL+F,格式化;
CTRL+K、CTRL+L,按照等号对齐;
设置快捷键Tools->Options->Text Editor和Keyboard;
参考连接:
Segger Embedded Studio使用有什么技巧? - 知乎 (zhihu.com)
- 2023-12-23
-
发表了日志:
【先楫HPM5361】环境搭建及Embedded Studio 的使用