chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

開發(fā)者分享 | 一次完整的 HPM EtherCAT 實(shí)戰(zhàn):環(huán)境、通信與極限測試

先楫半導(dǎo)體HPMicro ? 2026-02-09 16:32 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

概要

1、vscode開發(fā)環(huán)境搭建

2、EtherCAT與RK3562通訊測試

3、編程IGH主站+HPM極限通訊測試

4、ADC+EUI顯示測試

5、ADC遠(yuǎn)采系統(tǒng)


1.vscode開發(fā)環(huán)境搭建


1.1 SDK包下載

SDK包:

- SDK

- 編譯鏈

- 驅(qū)動(dòng)下載器的openocd(配置文件在sdk文件夾下,不在ocd工程里)配置文件

- python3

- cmake + ninja + 其他編譯腳本

- FTDI驅(qū)動(dòng)


官方開發(fā)指定用的是 SEGGER Embedded Studio ,但由于對(duì)eclipse系的東西實(shí)在沒有好感,于是摸索使用vscode開發(fā)的方法。


1.2 工程

從SDK目錄下 hpm_sdk\samples\ 拉取任意工程,我這里拉了GPIO工程

在VSCODE中安裝需要的擴(kuò)展:

·Cortex-Debug

·CMake Tool

d4d7c09a-0591-11f1-96ea-92fbcf53809c.png

3.配置系統(tǒng)的 SDK路徑、交叉編譯鏈路徑、python3、ninja 幾個(gè)環(huán)境.

但由于我不想往系統(tǒng)的PATH里面添加太多環(huán)境,于是在項(xiàng)目根目錄加CMakePresets.json

{
"version":3,
"configurePresets":[
{
"name":"tinnu-path",
"displayName":"tinnu獨(dú)立環(huán)境",
"description":"正在使用編譯器",
"binaryDir":"${sourceDir}/out/build/${presetName}",
"generator":"Ninja",
"environment":{
"GNURISCV_TOOLCHAIN_PATH":"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win",
"HPM_SDK_BASE":"E:/sdkpath/hpm_sdk",
"PATH":"E:/sdkpath/tools/python3;E:/sdkpath/tools/ninja;"
},
"cacheVariables":{
"CM***E_INSTALL_PREFIX":"${sourceDir}/out/install/${presetName}",
"CM***E_C_COMPILER":"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gcc.exe",
"CM***E_CXX_COMPILER":"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-g++.exe",
"HPM_BUILD_TYPE":"flash_xip",
"CM***E_BUILD_TYPE":"debug"
}
}
]
}

如果不配置CMakePresets.json,要么就改系統(tǒng)環(huán)境變量,要么在CMakeList.txt里面加入ENV,但PATH的修改還是需要加環(huán)境變量,在CMakeList.txt里面加不生效:

set(ENV{GNURISCV_TOOLCHAIN_PATH}"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win")
set(ENV{HPM_SDK_BASE}"E:/sdkpath/hpm_sdk/")

4.配置cmake路徑

如果也不希望在系統(tǒng)層面安裝cmake,或者以前安裝過其他版本的cmake,可以選擇在工程內(nèi)配置特定版本的cmake,這里就配置官方提供的版本:

d4e7b2a2-0591-11f1-96ea-92fbcf53809c.png

創(chuàng)建/打開 .vscode/setting.json

"cmake.cmakePath":"E:/sdkpath/tools/cmake/bin/cmake.exe",
"cmake.additionalCompilerSearchDirs":[
"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin"
]

5.配置編譯類型為xip。打開 .vscode/setting.json

"cmake.defaultVariants":{
"buildType":{
"default":"debug",
"description":"The build type.",
"choices":{
"flash_xip":{
"short":"flash_xip",
"long":"flash_xip.",
"buildType":"flash_xip"
}
}
}
}

6.配置編譯宏。打開 .vscode/setting.json

"cmake.configureArgs":[
"-DBOARD=hpm5e00evk"
]

7.編譯


1.3 調(diào)試

將開發(fā)板 DEBUG USB 口插入電腦

安裝調(diào)試器的驅(qū)動(dòng),調(diào)試器為板載FT2232HL,官方SDK打包下面: ./tools/FTDI_InstallDriver

-注意,由于WIN11的BUG,每次重新插入U(xiǎn)SB后(注意,是插入U(xiǎn)SB后!)都需要重新安裝驅(qū)動(dòng),否則不識(shí)別

打開官方下載軟件,官方SDK打包根目錄下的 ./start_gui

點(diǎn)擊 Launch GDB Server 這是集成了啟動(dòng)openocd的命令,具體命令會(huì)在點(diǎn)擊后出現(xiàn),可以在powershell里面手動(dòng)執(zhí)行

d4fc0068-0591-11f1-96ea-92fbcf53809c.png

配置vscode調(diào)試設(shè)置:

-創(chuàng)建/打開 .vscode/launch.json

{
"configurations":[
{
"name":"remote",
"cwd":"${workspaceRoot}",
"type":"cortex-debug",
"request":"launch",
"servertype":"external",
"gdbTarget":"localhost:3333",
"device":"hpm5e00",
"executable":"build/output/demo.elf",
"runToEntryPoint":"main",
"gdbPath":"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gdb.exe",
"targetId":"hpm5e00"
}
]
}

點(diǎn)擊F5即可啟動(dòng)調(diào)試

d514d7be-0591-11f1-96ea-92fbcf53809c.pngd52562e6-0591-11f1-96ea-92fbcf53809c.gifd55b5dd8-0591-11f1-96ea-92fbcf53809c.gif


2.Ethercat與RK3562通訊測試


2.1 Ethercat與RK3562通訊測試

下載 SSC TOOL

我以前開發(fā) Ethercat 使用的是5.12版本的SSC TOOL ,但是發(fā)現(xiàn)這個(gè)版本加載 HPM 的xml后無法在創(chuàng)建工程時(shí)顯示配置,看了下教程,是使用5.13版本的。

由于官方下載渠道的SSC TOOL是需要ETG會(huì)員賬號(hào),之前了解過這個(gè)賬號(hào)應(yīng)該是要每年給德國公司交錢才行。只能找些別的渠道,最終找到gitcode。你還真別說,gitcode的baba雖然掉錢眼里,還爬蟲github出過丑聞,但對(duì)于個(gè)人開發(fā)者來說,他確實(shí)是提供了一個(gè)不錯(cuò)的渠道。

V5.13

https://gitcode.com/open-source-toolkit/a3990

V5.12

https://gitcode.com/open-source-toolkit/9f481

git clone

https://gitcode.com/open-source-toolkit/a3990.git

下載ethercat上位機(jī)軟件

最官方的肯定是倍福自己的TwinCAT下載。

https://tr.beckhoff.com.cn/login/index.php

- 但老實(shí)說,官方的東西雖然UI,但概念上還是有些晦澀和難找的。尤其是最新的 TwinCAT3 還是附加在 Visual Studio 的,可能對(duì)于純粹的嵌入式開發(fā)者來說問題不大(只要你的硬盤沒被各種版本的vivado塞滿),但對(duì)于廣泛開發(fā)上下位機(jī)的小伙伴就不太友好了,嵌入到 Visual Studio 里面可能會(huì)對(duì) Visual Studio 本身的環(huán)境產(chǎn)生某些不可估計(jì)的掣肘。

- 另外就是這個(gè)軟件安裝起來還是比較麻煩的,還吃網(wǎng)卡類型。當(dāng)初第一次接觸的時(shí)候,半天掃不到下位機(jī)。讓下位機(jī)廠家?guī)兔φ{(diào)試半天都搞不定,最后重啟一下突然好了……

另外就是使用嵌入式開發(fā)板,刷入 linux-rt 使用 igh 上位機(jī)用命令行測試。我個(gè)人感覺這個(gè)方法還是比較簡便的(如果省略掉編譯linux-rt內(nèi)核與交叉編譯igh主站驅(qū)動(dòng)的工作)

主站準(zhǔn)備

我以前開發(fā)ethercat的時(shí)候就安裝過 TwinCAT3 ,不再贅述(太過麻煩,不想回憶了)

另外手頭有創(chuàng)龍的 3562EVM 板卡,剛好官方適配了 Linux-RT + IGH Ethercat 主站,以下分別測試


2.2 下位機(jī)軟件生成編譯

項(xiàng)目創(chuàng)建配置

把 /hpm_sdk\samples\ethercat\ecat_io、/hpm_sdk\samples\ethercat\port 拉出來單獨(dú)一個(gè)文件夾

按照之前設(shè)置 CMakePresets.json

{
"version":3,
"configurePresets":[
{
"name":"tinnu-path",
"displayName":"tinnu獨(dú)立環(huán)境",
"description":"正在使用編譯器",
"binaryDir":"${sourceDir}/out/build/${presetName}",
"generator":"Ninja",
"environment":{
"GNURISCV_TOOLCHAIN_PATH":"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win",
"HPM_SDK_BASE":"E:/sdkpath/hpm_sdk",
"PATH":"E:/sdkpath/tools/python3;E:/sdkpath/tools/ninja;"
},
"cacheVariables":{
"CM***E_INSTALL_PREFIX":"${sourceDir}/out/install/${presetName}",
"CM***E_C_COMPILER":"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-gcc.exe",
"CM***E_CXX_COMPILER":"E:/sdkpath/toolchains/rv32imac_zicsr_zifencei_multilib_b_ext-win/bin/riscv32-unknown-elf-g++.exe",
"HPM_BUILD_TYPE":"flash_xip",
"CM***E_BUILD_TYPE":"debug"
}
}
]
}

按照上一篇帖子,設(shè)置 .vscode/setting.json

生成 SSC 源碼

倍福為了把 ethercat 這只現(xiàn)金奶牛牢牢掌握在自己手里,相關(guān)的源碼必須用他們的軟件生成。因此HPM方面的例程是缺了這塊源碼的(這個(gè)對(duì)于其他的芯片也都是這樣的,開發(fā)過ethercat就會(huì)知道)

上面下載了SSC TOOL,把HPM專用的設(shè)置導(dǎo)入SSC TOOL。

- Tool->Options->Configurations里面,點(diǎn)擊+號(hào),導(dǎo)入SDK里的配置文件:/hpm_sdk\samples\ethercat\ecat_io下面的SSC\Config\HPM_ECAT_IO_Config

d5879a4c-0591-11f1-96ea-92fbcf53809c.png

創(chuàng)建SSC工程:File->New->custom 選擇剛導(dǎo)入的HPM配置

d595cd1a-0591-11f1-96ea-92fbcf53809c.png

導(dǎo)入應(yīng)用:Tool->Application->Import

d5d0f912-0591-11f1-96ea-92fbcf53809c.png

生成C代碼

d5ecde5c-0591-11f1-96ea-92fbcf53809c.png

拉到/hpm_sdk\samples\ethercat\ecat_io\SSC下面

補(bǔ)丁說明

官網(wǎng)教程里面提到了需要打補(bǔ)丁但實(shí)測下來,打補(bǔ)丁反而會(huì)導(dǎo)致下位機(jī)卡在INIT里面,不打反而是正常的。


2.3 調(diào)試

編譯下載調(diào)試

編譯后,按照上一篇帖子,設(shè)置 .vscode/launch.json

打開官方下載軟件,官方SDK打包根目錄下的 ./start_gui

- 點(diǎn)擊 Launch GDB Server 這是集成了啟動(dòng)openocd的命令,具體命令會(huì)在點(diǎn)擊后出現(xiàn),可以在powershell里面手動(dòng)執(zhí)行

d6044f60-0591-11f1-96ea-92fbcf53809c.png

點(diǎn)擊F5


使用創(chuàng)龍3562+IGH掃描設(shè)備

掃描從站

d6193470-0591-11f1-96ea-92fbcf53809c.png

掃描EEPROM SII表

bin/ethercat sii_read -p 0 -v

SII Area:
800c8166000000001234000000007700
4d504800010000000100000000000000
00000000000000000000000000000000
00108000801080000400000000000000
00000000000000000000000000000000
00000000000000000000000000000000
00000000000000000000000000000000
0000000000000000000000000f000100
SII Category0x000a(STRINGS),71words
080b454341545f4465766963650a6469
676974616c5f696f0853796e6368726f
6e0b534d2d53796e6368726f6e21496e
707574436f756e7465722070726f6365
73732064617461206d617070696e670c
496e707574436f756e746572224f7574
707574436f756e7465722070726f6365
73732064617461206d617070696e670d
4f7574707574436f756e74657200
SII Category0x001e(General),16words
01000202002300000000000c00000100
11000000000000000000000000000000
SII Category0x0028(FMMU),2words
010203ff
SII Category0x0029(SyncM),16words
00108000260001018010800022000102
00110400640001030014040020000104
SII Category0x0032(TXPDO),8words
001a0103000500000060000607200000
SII Category0x0033(RXPDO),8words
00160102000700001070000807200000
SII Category0x003c(DC),12words
00000000000000000000000000000000
0000030400000000

(1) 設(shè)備基礎(chǔ)信息(SII Header)

廠商ID:0x000c80(十六進(jìn)制) → Beckhoff Automation GmbH(標(biāo)準(zhǔn)EtherCAT廠商代碼)

產(chǎn)品碼:0x00006681 → 特定設(shè)備型號(hào)標(biāo)識(shí)符(需查Beckhoff文檔確認(rèn)具體型號(hào))

版本號(hào):0x00007700 → 硬件版本V7.7

序列號(hào):0x00001234 → 設(shè)備唯一序列號(hào)4660

EEPROM配置校驗(yàn):末字節(jié)0x0001表示校驗(yàn)通過

(2)字符串描述(Category 0x000a: STRINGS)

解碼后關(guān)鍵標(biāo)識(shí):

設(shè)備名稱:"ECAT_Device"(45 43 41 54 5f 44 65 76 69 63 65)

功能描述:

- "digital_io" → 數(shù)字輸入/輸出模塊

- "Synchron" & "SM-Synchron" → 支持同步功能

- "InputCounter process data mapping" → 輸入計(jì)數(shù)器PDO映射

- "OutputCounter process data mapping" → 輸出計(jì)數(shù)器PDO映射

(3)同步管理器配置(Category 0x0029: SyncM)

4個(gè)同步管理器定義:

d62dc246-0591-11f1-96ea-92fbcf53809c.png

(4)分布式時(shí)鐘配置(Category 0x003c: DC)

關(guān)鍵值:0x0304

- 比特0-2:0x04 → 支持DC同步模式

- 比特3-7:0x03 → 時(shí)鐘精度±50ns(高精度級(jí)別)

(5)FMMU配置(Category 0x0028)

字段:01 02 03 ff

- FMMU0:啟用,邏輯→物理地址映射

- FMMU1:啟用,方向?yàn)檩斎?/p>

- FMMU2:啟用,用于同步狀態(tài)管理

- 0xFF:填充終止符


寄存器

上面分析過,輸入是 0x1400 ,我們可以看一下:

- 進(jìn)入OP模式bin/ethercat state -p 0 OP

- bin/ethercat reg_read -p 0 -t uint32 0x1400

d644cefa-0591-11f1-96ea-92fbcf53809c.png


使用TWinCAT掃描設(shè)備

掃描從站

d6515864-0591-11f1-96ea-92fbcf53809c.pngd669f52c-0591-11f1-96ea-92fbcf53809c.pngd67e50c6-0591-11f1-96ea-92fbcf53809c.png

監(jiān)控輸入

d69355d4-0591-11f1-96ea-92fbcf53809c.gif

設(shè)置輸出

d6c06f24-0591-11f1-96ea-92fbcf53809c.gif


3.編程IGH主站+HPM極限通訊測試


上文中使用TWinCAT和IGH主站命令行進(jìn)行簡單的讀取,但工程應(yīng)用還是需要嵌入到程序中。
接下來,我們使用RK3562+LINUX RT+IGH主站的庫,編程輪詢讀寫HPM從站,并測試通訊的極限速度。


3.1 配置查詢

從站配置

#./ethercat slaves-v
=Master0,Slave0=
Alias:13330
Device:Main
State:SAFEOP+ERROR
Flag:E
Identity:
Vendor Id:0x0048504d
Product code:0x00000001
Revision number:0x00000001
Serial number:0x00000000
DL information:
FMMU bit operation:no
Distributed clocks:yes,64bit
DC system time transmission delay:0ns
Port Type Link Loop Signal NextSlave RxTime[ns] Diff[ns] NextDc[ns]
0 MII up open yes -402292431400
1 MII down closed no ----
2 MII down closed no ----
3 N/A down closed no ----
Mailboxes:
Bootstrap RX:0x0000/0,TX:0x0000/0
Standard RX:0x1000/128,TX:0x1080/128
Supported protocols:CoE
General:
Group:ECAT_Device
Image name:
Order number:digital_io
Device name:digital_io
CoE details:
Enable SDO:yes
Enable SDO Info:yes
Enable PDO Assign:no
Enable PDO Configuration:no
Enable Upload at startup:no
Enable SDO complete access:yes
Flags:
Enable SafeOp:no
Enable notLRW:no
Current consumption:0mA

PDO配置

#bin/ethercat cstruct
/* Master 0, Slave 0, "digital_io"
* Vendor ID: 0x0048504d
* Product code: 0x00000001
* Revision number: 0x00000001
*/

ec_pdo_entry_info_tslave_0_pdo_entries[]={
{0x7010,0x00,32},/* OutputCounter */
{0x6000,0x00,32},/* InputCounter */
};

ec_pdo_info_tslave_0_pdos[]={
{0x1600,1,slave_0_pdo_entries+0},/* OutputCounter process data mapping */
{0x1a00,1,slave_0_pdo_entries+1},/* InputCounter process data mapping */
};

ec_sync_info_tslave_0_syncs[]={
{0,EC_DIR_OUTPUT,0,NULL,EC_WD_DISABLE},
{1,EC_DIR_INPUT,0,NULL,EC_WD_DISABLE},
{2,EC_DIR_OUTPUT,1,slave_0_pdos+0,EC_WD_ENABLE},
{3,EC_DIR_INPUT,1,slave_0_pdos+1,EC_WD_DISABLE},
{0xff}
};

PDO映射

#./ethercat pdos-p0
SM0:PhysAddr0x1000,DefaultSize 128,ControlRegister0x26,Enable1
SM1:PhysAddr0x1080,DefaultSize 128,ControlRegister0x22,Enable1
SM2:PhysAddr0x1100,DefaultSize 4,ControlRegister0x64,Enable1
RxPDO0x1600"OutputCounter process data mapping"
PDO entry0x7010:00,32bit,"OutputCounter"
SM3:PhysAddr0x1400,DefaultSize 4,ControlRegister0x20,Enable1
TxPDO0x1a00"InputCounter process data mapping"
PDO entry0x6000:00,32bit,"InputCounter"


3.2 IGH主站配置

主站工程創(chuàng)建

拉取IGH主站源碼,在 examples 下有例程。其中 rtai 這類的是高實(shí)時(shí)性要求的情況,需要編譯為內(nèi)核模塊注冊進(jìn)內(nèi)核里,用起來比較麻煩,特別是一些現(xiàn)有的項(xiàng)目里面想要遷移ethercat的話,還是使用 user 比較好。

拷貝 examples/dc_user 例程到獨(dú)立目錄,配置CMakeLists指定igh主站編譯主機(jī)里面的cmake,然后在TARGET_LINK_LIBRARIES里面添加EtherLab:

include(/home/user/toolchain/rk/3562rt/ethercat/install/lib/cmake/ethercat/ethercat-config.cmake)
TARGET_LINK_LIBRARIES(${PROJECT_NAME}PRIVATE
-lpthread-lssl-lcrypto-lrt
EtherLab::ethercat)


主站配置與從站地址定位

首先獲取配置句柄 ec_slave_config_t

通過 ethercat slaves -v 可以獲取 Alias Vendor Id Product code 填進(jìn) ecrt_master_slave_config 的參數(shù)里。

然后配置需要讀取的寄存器,獲取偏移位置:

通過 ethercat pdos -p 0 可以獲取 PDO entry 信息,填入 ecrt_slave_config_reg_pdo_entry 的參數(shù)里面。


主站輪詢讀取

先接收EtherCAT數(shù)據(jù)

ecrt_master_receive(master);
ecrt_domain_process(domain1);

使用 EC_READ_U32 和 EC_WRITE_U32 修改寄存器數(shù)據(jù)

修改之后發(fā)送回去EtherCAT從站

ecrt_domain_queue(domain1);
ecrt_master_send(master);


3.3 主從站極限速度測試

主站配置用于檢測的翻轉(zhuǎn)IO

初始化

board_init();
gpio_set_pin_output_with_initial(HPM_GPIO0,GPIO_DI_GPIOC,10,0);
gpio_set_pin_output_with_initial(HPM_GPIO0,GPIO_DI_GPIOB,30,0);
gpio_set_pin_output_with_initial(HPM_GPIO0,GPIO_DI_GPIOB,31,0);


這里使用邏輯分析儀監(jiān)視這些IO的電平


獨(dú)立一個(gè)程序測試IO翻轉(zhuǎn)

intmain(void)
{
uint8_tstatus;
board_init();
gpio_set_pin_output_with_initial(HPM_GPIO0,GPIO_DI_GPIOB,31,0);
gpio_set_pin_input(HPM_GPIO0,GPIO_DI_GPIOC,8);
while(1)
{
status=gpio_read_pin(HPM_GPIO0,GPIO_DI_GPIOC,8);
gpio_write_pin(HPM_GPIO0,GPIO_DI_GPIOB,31,!status);
}
}

測試發(fā)現(xiàn),翻轉(zhuǎn)速度達(dá)到納秒級(jí),足夠進(jìn)行ethercat翻轉(zhuǎn)實(shí)驗(yàn)


配置ethercat模擬EEPROM讀寫控制的函數(shù)

staticUINT8 pin2_level=0;
staticUINT32 counter=0;
voidAPPL_SetLed(UINT32 value)
{
UINT8 led0=((value&1)? BOARD_ECAT_OUT_ON_LEVEL:!BOARD_ECAT_OUT_ON_LEVEL);
UINT8 led1=((value&2)? BOARD_ECAT_OUT_ON_LEVEL:!BOARD_ECAT_OUT_ON_LEVEL);
UINT8 led2=((value&4)? BOARD_ECAT_OUT_ON_LEVEL:!BOARD_ECAT_OUT_ON_LEVEL);

gpio_write_pin(BOARD_ECAT_OUT1_GPIO,BOARD_ECAT_OUT1_GPIO_PORT_INDEX,BOARD_ECAT_OUT1_GPIO_PIN_INDEX,led0);
gpio_write_pin(BOARD_ECAT_OUT2_GPIO,BOARD_ECAT_OUT2_GPIO_PORT_INDEX,BOARD_ECAT_OUT2_GPIO_PIN_INDEX,led1);
gpio_write_pin(HPM_GPIO0,GPIO_DI_GPIOB,30,led2);
gpio_write_pin(HPM_GPIO0,GPIO_DI_GPIOB,31,!led2);
}

UINT32APPL_GetDipSw(void)
{
UINT8 pin0_level=gpio_read_pin(BOARD_ECAT_IN1_GPIO,BOARD_ECAT_IN1_GPIO_PORT_INDEX,BOARD_ECAT_IN1_GPIO_PIN_INDEX);
UINT8 pin1_level=gpio_read_pin(BOARD_ECAT_IN2_GPIO,BOARD_ECAT_IN2_GPIO_PORT_INDEX,BOARD_ECAT_IN2_GPIO_PIN_INDEX);
// UINT8 pin2_level = gpio_read_pin(HPM_GPIO0, GPIO_DI_GPIOC, 8);
pin2_level=!pin2_level;

UINT32 val=pin0_level<<0|pin1_level<<1|pin2_level<<2;
gpio_write_pin(HPM_GPIO0,GPIO_DI_GPIOC,10,pin2_level);
if((counter++&0xFFF)==0)
{
printf("poll count: %X\n",counter);
}

returnval;
}


讀寫極限測試

通過修改主站代碼。

while(1)
{
// 1. 等待下一個(gè)周期
wakeupTime=timespec_add(wakeupTime,cycletime);
clock_nanosleep(CLOCK_TO_USE,TIMER_ABSTIME,&wakeupTime,NULL);

clock_gettime(CLOCK_TO_USE,&currentTime);
counter++;
if(DIFF_NS(lastFlipTime,currentTime)>=1000000000)
{
printf("counter: %d(%d)\n",counter,counter2);
counter=0;
counter2=0;
lastFlipTime=currentTime;
}

// 2. 接收EtherCAT數(shù)據(jù)
ecrt_master_receive(master);
ecrt_domain_process(domain1);

// 3. 讀取所有16個(gè)模擬量輸入通道
// for (int i = 0; i < 16; i++)
inti=0;
{
// 獲取當(dāng)前通道的偏移量
offset=analog_in_offsets[i];

// 從域數(shù)據(jù)中讀取16位值
fresh_pd=ecrt_domain_data(domain1);
raw_value=EC_READ_U32(fresh_pd+offset);
if(raw_value!=raw_valueo)
{
raw_valueo=raw_value;
raw_write=raw_value;
counter2++;
}
}
EC_WRITE_U32(fresh_pd+et_output_offsets,raw_write);

ecrt_domain_queue(domain1);
ecrt_master_send(master);
}

分別使用1ms周期、300us周期對(duì)從站進(jìn)行輪詢,PB30都能跟上PC10,這證明了兩件事

- 當(dāng)前架構(gòu)下, ethercat 能夠滿足300us輪詢。

- 一旦主站發(fā)起通訊,從站會(huì)按照主站的輪詢速度刷新數(shù)據(jù)。(這個(gè)我做過打印測試,在主站程序不運(yùn)行的時(shí)候,從站是滿速刷新,一旦主站發(fā)起通訊,就按照主站速度刷新)

以下是使用邏輯分析儀測試的結(jié)果

分析

首先明確,當(dāng)前例程的從站是先讀后寫:

voidAPPL_Application(void)
{
InputCounter0x6000=APPL_GetDipSw();
APPL_SetLed((UINT32)OutputCounter0x7010);
}

根據(jù)時(shí)序圖分析,可得:從站的處理邏輯是:在主站進(jìn)行了一次讀寫后,在刷新緩存(即模擬的EEPROM),而非每次主站的請求到達(dá)才調(diào)用 APPL_SetLed、APPL_GetDipSw 獲取數(shù)據(jù)。這種緩存刷新機(jī)制有效避免數(shù)據(jù)輪詢的時(shí)間開銷。


純寫極限測試

主站不管從站是否來得及刷新,拼命寫,測試最高可以到33us左右,我這里測試了一個(gè)50us:

while(1)
{
// 1. 等待下一個(gè)周期
wakeupTime=timespec_add(wakeupTime,cycletime);
clock_nanosleep(CLOCK_TO_USE,TIMER_ABSTIME,&wakeupTime,NULL);

clock_gettime(CLOCK_TO_USE,&currentTime);
counter++;
if(DIFF_NS(lastFlipTime,currentTime)>=1000000000)
{
printf("counter: %d(%d)\n",counter,counter2);
counter=0;
counter2=0;
lastFlipTime=currentTime;
}

// 2. 接收EtherCAT數(shù)據(jù)
ecrt_master_receive(master);
ecrt_domain_process(domain1);

// 3. 讀取所有16個(gè)模擬量輸入通道
// for (int i = 0; i < 16; i++)
inti=0;
{
// 獲取當(dāng)前通道的偏移量
offset=analog_in_offsets[i];

// 從域數(shù)據(jù)中讀取16位值
fresh_pd=ecrt_domain_data(domain1);
raw_value=EC_READ_U32(fresh_pd+offset);
}

// 5. 準(zhǔn)備并發(fā)送輸出數(shù)據(jù)
raw_write=raw_write?0:0x7;
EC_WRITE_U32(fresh_pd+et_output_offsets,raw_write);

ecrt_domain_queue(domain1);
ecrt_master_send(master);
}


4.ADC+EUI顯示測試


4.1 EUI

HPM有個(gè)專門串行驅(qū)動(dòng)外部數(shù)碼管(如 74 系列的 595 芯片)的EUI外設(shè),可以在占用少量IO口的情況下驅(qū)動(dòng)大量數(shù)碼管。

相關(guān)例程在 hpm_sdk\components\segment_led\ 下。

我們使用這個(gè)驅(qū)動(dòng)庫,需要在 CMakeLists.txt 里面添加

set(CONFIG_HPM_SEGMENT_LED1)

這就自動(dòng)把從模塊加載進(jìn)工程中編譯。

初始化

init_eui_pins(BOARD_EUI);
clock_add_to_group(BOARD_EUI_CLOCK_NAME,0);
uint32_ts_eui_clock_freq=clock_get_frequency(BOARD_EUI_CLOCK_NAME);
init_eui_config();
segment_led_config_eui_instance(BOARD_EUI,s_eui_clock_freq);
segment_led_config_blink_period(500,500);

可以通過 segment_led_config_disp_blink 函數(shù)設(shè)置哪些位閃動(dòng)。

通過 segment_led_set_disp_data 設(shè)置指定數(shù)碼管顯示。

后面對(duì)ADC結(jié)果顯示,需要對(duì)字符串顯示進(jìn)行封裝:

staticinlinevoidsegment_led_set_disp_dataX(uint8_tindex,chariid,intisDot)
{
if(iid<'0'||iid>'F')
iid=0;
else
iid=iid-'0';

segment_led_set_disp_data(index,s_disp_code_8_seg[iid]|(isDot?BOARD_EUI_SEG_DP_BIT_MASK:0));
}

staticvoidupdate_seg_led_disp_dataX(charshow[],intdotId)
{
segment_led_set_disp_dataX(0,show[0],dotId 0);
segment_led_set_disp_dataX(1,show[1],dotId 1);
segment_led_set_disp_dataX(2,show[2],dotId 2);
segment_led_set_disp_dataX(3,show[3],dotId 3);
segment_led_set_disp_dataX(4,show[4],dotId==4);
}


4.2 ADC測試

例程默認(rèn)ADC初始化流程:

/* ADC pin initialization */
board_init_adc16_pins();

/* ADC clock initialization */
board_init_adc_clock(BOARD_APP_ADC16_BASE,true);

/* ADC16 common initialization */
init_common_config(conv_mode);

/* ADC16 read patter and DMA initialization */
init_period_config();

board_init_adc16_pins 所定義的引腳為 IOC_PAD_PF26。

由于官方?jīng)]有提供原理圖,無法得知PF26具體連接到哪里,只能根據(jù) IO文檔 猜測。

d6e90e16-0591-11f1-96ea-92fbcf53809c.png

看描述應(yīng)該是兩個(gè)類似天線SMA接口(紅色標(biāo)注),但手上沒有這種差分線。這里還標(biāo)注了J3[6]的位置,J3是下面的電機(jī)接口排針。J3[6]應(yīng)該就是第六根,絲印為ADC_C。

在while循環(huán)里面輪詢獲取當(dāng)前的ADC值,并轉(zhuǎn)化為字符串存儲(chǔ)在全局變量 bShowValue 中:

voidperiod_handler(void)
{
uint16_tresult;
doublevalue;

adc16_get_prd_result(BOARD_APP_ADC16_BASE,BOARD_APP_ADC16_CH_1,&result);
value=result*3.3/0xFFFF;
snprintf(bShowValue,32,"%.4f",value);
}


4.3 整合顯示

通過數(shù)碼管顯示當(dāng)前采樣:

b=strcspn(bShowValue,".");
strncpy(tShow,bShowValue,5);
if(b<5)
{
strncpy(tShow+b,bShowValue+b+1,5-b);
}
update_seg_led_disp_dataX(tShow,b-1);

引出3.3V,采用電阻進(jìn)行分壓。用ADC_C分別測試兩個(gè)分壓的采樣:

d6ff5bee-0591-11f1-96ea-92fbcf53809c.jpg

測試效果

d71200be-0591-11f1-96ea-92fbcf53809c.gif


5.ADC遠(yuǎn)采系統(tǒng)


項(xiàng)目功能:3562主站,通過ethercat 遠(yuǎn)采HPM從站的ADC碼值,輸出到CSV文件,通過WPS生成點(diǎn)圖觀察


5.1 HPM從機(jī)端驅(qū)動(dòng)

加快ADC采樣周期,假設(shè)HPM設(shè)置200HMz運(yùn)行,ADC周期觸發(fā)需要以100K分頻才能跟得上1ms的通訊周期:
215?3=98304

配置函數(shù)修改:

voidinit_period_config(void)
{
adc16_channel_config_tch_cfg;
adc16_prd_config_tprd_cfg;

/* get a default channel config */
adc16_get_channel_default_config(&ch_cfg);

/* initialize an ADC channel */
ch_cfg.ch =BOARD_APP_ADC16_CH_1;
ch_cfg.sample_cycle=APP_ADC16_CH_SAMPLE_CYCLE;

adc16_init_channel(BOARD_APP_ADC16_BASE,&ch_cfg);

prd_cfg.ch =BOARD_APP_ADC16_CH_1;
prd_cfg.prescale =15;/* Set divider: 2^22 clocks */
prd_cfg.period_count=3;/* 104.86ms when AHB clock at 200MHz is ADC clock source */

adc16_set_prd_config(BOARD_APP_ADC16_BASE,&prd_cfg);
}

修改上傳數(shù)據(jù),在函數(shù)APPL_Application中:

InputCounter0x6000=result*3.3/0xFFFF*1000;


5.2 主機(jī)端

讀取反饋數(shù)據(jù),輸出到CSV文件:

offset=analog_in_offsets[0];
fresh_pd=ecrt_domain_data(domain1);
uint32_tva=EC_READ_U32(fresh_pd+offset);
printf("ADC %d mV\n",va);
bQueue.push(va);

if(bQueue.size()>2000)
{
// 輸出到CSV文件
staticintfile_index=0;
charfilename[64];
sprintf(filename,"data_output_%d.csv",file_index++);

FILE*fp=fopen(filename,"w");
if(fp){
fprintf(fp,"Value\n");
while(!bQueue.empty()){
fprintf(fp,"%d\n",bQueue.front());
bQueue.pop();
}
fclose(fp);
printf("Data saved to %s\n",filename);
}else{
printf("Failed to create file %s\n",filename);
// 清空隊(duì)列
while(!bQueue.empty()){
bQueue.pop();
}
}
}


5.3 測試環(huán)境

使用一個(gè)ICL8038作為正弦波形發(fā)生源:

d7771648-0591-11f1-96ea-92fbcf53809c.jpg

輸入上次ADC項(xiàng)目同一端口

d78b8524-0591-11f1-96ea-92fbcf53809c.jpg


5.4 輸出效果

d7a72d92-0591-11f1-96ea-92fbcf53809c.png


文章來源:EEFocus

開發(fā)者ID:day_day

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報(bào)投訴
  • 測試
    +關(guān)注

    關(guān)注

    9

    文章

    6155

    瀏覽量

    131249
  • ethercat
    +關(guān)注

    關(guān)注

    19

    文章

    1487

    瀏覽量

    44926
  • HPM
    HPM
    +關(guān)注

    關(guān)注

    2

    文章

    50

    瀏覽量

    8240
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    HarmonyOS開發(fā)案例:【一次開發(fā),多端部署(視頻應(yīng)用)】

    提供了“一次開發(fā),多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次開發(fā),快速構(gòu)建不同類型終端上的應(yīng)用,降低開發(fā)
    的頭像 發(fā)表于 05-11 15:41 ?2443次閱讀
    HarmonyOS<b class='flag-5'>開發(fā)</b>案例:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署(視頻應(yīng)用)】

    鴻蒙OS開發(fā):【一次開發(fā),多端部署】(視頻應(yīng)用)

    提供了“一次開發(fā),多端部署”的系統(tǒng)能力,讓開發(fā)者可以基于一次開發(fā),快速構(gòu)建不同類型終端上的應(yīng)用,降低開發(fā)
    的頭像 發(fā)表于 05-25 16:29 ?5696次閱讀
    鴻蒙OS<b class='flag-5'>開發(fā)</b>:【<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b>,多端部署】(視頻應(yīng)用)

    華為開發(fā)者大會(huì)2021:一次開發(fā) 多端部署

    一次開發(fā) 多端部署使能開發(fā)者從單設(shè)備生態(tài)跨入多設(shè)備生態(tài)!
    的頭像 發(fā)表于 10-22 15:09 ?2016次閱讀
    華為<b class='flag-5'>開發(fā)者</b>大會(huì)2021:<b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b> 多端部署

    華為開發(fā)者大會(huì)2021:軟件部總裁龔體 鴻蒙系統(tǒng) 一次開發(fā) 多端部署 萬物互連

    華為開發(fā)者大會(huì)2021:鴻蒙系統(tǒng) 一次開發(fā) 多端部署 萬物互連 在華為開發(fā)者大會(huì)2021上,華為消費(fèi)業(yè)務(wù)軟件部總裁龔體詳細(xì)分解了鴻蒙系統(tǒng)的
    的頭像 發(fā)表于 10-22 15:09 ?5188次閱讀
    華為<b class='flag-5'>開發(fā)者</b>大會(huì)2021:軟件部總裁龔體 鴻蒙系統(tǒng) <b class='flag-5'>一次</b><b class='flag-5'>開發(fā)</b> 多端部署 萬物互連

    HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-華為ArkUI開發(fā)框架和場景測試

    HDC 2021華為開發(fā)者大會(huì)HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-華為ArkUI開發(fā)框架和場景測試
    的頭像 發(fā)表于 10-23 15:16 ?2413次閱讀
    HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-華為ArkUI<b class='flag-5'>開發(fā)</b>框架和場景<b class='flag-5'>測試</b>

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)--Deveco Testing音頻測試工具與結(jié)果

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-Deveco Testing音頻測試工具與結(jié)果
    的頭像 發(fā)表于 10-23 16:36 ?3014次閱讀
    華為<b class='flag-5'>開發(fā)者</b>分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>--Deveco Testing音頻<b class='flag-5'>測試</b>工具與結(jié)果

    華為開發(fā)者大會(huì)分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測試挑戰(zhàn)

    HDC 2021華為開發(fā)者大會(huì)分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備測試挑戰(zhàn)
    的頭像 發(fā)表于 10-23 16:40 ?2296次閱讀
    華為<b class='flag-5'>開發(fā)者</b>大會(huì)分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-鴻蒙智聯(lián)認(rèn)證生態(tài)設(shè)備<b class='flag-5'>測試</b>挑戰(zhàn)

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-DECC認(rèn)證測試工具

     HDC 2021華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-DECC認(rèn)證測試工具
    的頭像 發(fā)表于 10-23 16:45 ?2808次閱讀
    華為<b class='flag-5'>開發(fā)者</b>分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-DECC認(rèn)證<b class='flag-5'>測試</b>工具

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-DECC遠(yuǎn)程托管測試服務(wù)

    HDC 2021華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-DECC遠(yuǎn)程托管測試服務(wù)
    的頭像 發(fā)表于 10-23 16:48 ?2068次閱讀
    華為<b class='flag-5'>開發(fā)者</b>分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-DECC遠(yuǎn)程托管<b class='flag-5'>測試</b>服務(wù)

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-DECC靠近發(fā)現(xiàn)穩(wěn)定性測試

    HDC 2021華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-DECC靠近發(fā)現(xiàn)穩(wěn)定性測試
    的頭像 發(fā)表于 10-23 16:58 ?2004次閱讀
    華為<b class='flag-5'>開發(fā)者</b>分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-DECC靠近發(fā)現(xiàn)穩(wěn)定性<b class='flag-5'>測試</b>

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-AI語音聲學(xué)能力測試

     HDC 2021華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-AI語音聲學(xué)能力測試
    的頭像 發(fā)表于 10-23 17:01 ?2156次閱讀
    華為<b class='flag-5'>開發(fā)者</b>分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-AI語音聲學(xué)能力<b class='flag-5'>測試</b>

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-BOX硬件輔助與網(wǎng)絡(luò)仿真

    HDC 2021華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-BOX硬件輔助與網(wǎng)絡(luò)仿真方案展示
    的頭像 發(fā)表于 10-23 17:05 ?2109次閱讀
    華為<b class='flag-5'>開發(fā)者</b>分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-BOX硬件輔助與網(wǎng)絡(luò)仿真

    華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-BOX網(wǎng)絡(luò)損傷Demo演示

    HDC 2021華為開發(fā)者分論壇HarmonyOS測試技術(shù)與實(shí)戰(zhàn)-BOX網(wǎng)絡(luò)損傷Demo演示
    的頭像 發(fā)表于 10-23 17:10 ?2205次閱讀
    華為<b class='flag-5'>開發(fā)者</b>分論壇HarmonyOS<b class='flag-5'>測試</b>技術(shù)與<b class='flag-5'>實(shí)戰(zhàn)</b>-BOX網(wǎng)絡(luò)損傷Demo演示

    三星2021開發(fā)者大會(huì):第一次線上形式的虛擬開發(fā)者大會(huì)

    10月27日,三星召開了2021年開發(fā)者大會(huì)(簡稱2021 SDC),這是三星有史以來第一次以線上形式召開的虛擬開發(fā)者大會(huì)。三星面向消費(fèi)、開發(fā)
    的頭像 發(fā)表于 11-08 10:05 ?2496次閱讀

    開發(fā)者分享 | HPM5E-EC-DEV:基于HPM5E00的EtherCAT開發(fā)板分享

    Azure名業(yè)余單片機(jī)愛好,平時(shí)喜歡折騰各種開發(fā)板和新出的MCU。本職工作是名軟件工程師,日常主要從事軟件應(yīng)用開發(fā),更多是和系統(tǒng)、應(yīng)用
    的頭像 發(fā)表于 10-29 10:15 ?1379次閱讀
    <b class='flag-5'>開發(fā)者</b>分享 | <b class='flag-5'>HPM</b>5E-EC-DEV:基于<b class='flag-5'>HPM</b>5E00的<b class='flag-5'>EtherCAT</b><b class='flag-5'>開發(fā)</b>板分享