概要
1、EUI的簡單使用
2、16位ADC采樣實驗
3、SDM對Σ-Δ調制器輸出數據采樣
5、EtherCat io示例實踐
一、EUI的簡單使用
收到HPM5E00開發板后,由于SDK V1.9版本尚未支持該型號,開發板只能暫時存放在包裝盒中,等待新版本發布。經過一段時間的等待,終于在7月1日收到了SDK V1.10版本發布的通知。我立即下載了最新版本,打開start_gui工具后,欣喜地發現界面中已經明確顯示支持HPM5E00evk開發板。這意味著現在可以正式開始基于這款開發板的探索和開發工作了。
既然開發板上最顯眼的就是LED數碼管,那就從它開始探索吧。
首先,我查閱了開發板的原理圖,確認數碼管驅動方式。接著在SDK的例程中尋找相關的驅動代碼,發現官方文檔中已經有了關于EUI的說明,而且已經提供了EUI的示例,這正是控制數碼管顯示的基礎。

我修改了示例代碼,試著讓數碼管顯示自增數字,即每500ms數字加一。
數碼管雖小,卻是一個很好的切入點。通過它,可以逐步熟悉這款芯片的EUI庫函數,為更復雜的開發打下基礎。
1.1 EUI功能描述
用戶手冊中有關于EUI的描述

可以理解EUI是用于嵌入式系統中的矩陣鍵盤或LED顯示控制,至于如何使用,使用好官方提供的庫函數即可。
1.2 軟件部分
使用start_gui工具從例程中生成工程

生成后,可以用SEGGER Embedded Studio 8.24打開工程,進行修改
在main函數中,注釋掉原有的函數,調用一個自己的函數
//led_disp_config();
segment_disp();
segment_disp內容如下:
voidsegment_disp(void)
{
eui_scan_disp_data_tdisp_data;
disp_data.data_8x8[0]=s_disp_code_8_seg[(count/10000)%10];
disp_data.data_8x8[1]=s_disp_code_8_seg[(count/1000)%10];
disp_data.data_8x8[2]=s_disp_code_8_seg[(count/100)%10];
disp_data.data_8x8[3]=s_disp_code_8_seg[(count/10)%10];
disp_data.data_8x8[4]=s_disp_code_8_seg[count%10];
eui_set_scan_disp_data(BOARD_EUI,0,&disp_data);
count++;
}
就是每次調用函數,count加一,并在5個數碼管上顯示各位數字
在while(1)中增加
segment_disp();
board_delay_ms(500);
每500ms,增加一次count
eui引腳初始化
init_eui_pins(BOARD_EUI);
其中#define BOARD_EUI HPM_EUI1
voidinit_eui_pins(EUI_Type*ptr)
{
if(ptr==HPM_EUI1){
HPM_IOC->PAD[IOC_PAD_PB26].FUNC_CTL=IOC_PB26_FUNC_CTL_EUI1_CK;
HPM_IOC->PAD[IOC_PAD_PB27].FUNC_CTL=IOC_PB27_FUNC_CTL_EUI1_SH;
HPM_IOC->PAD[IOC_PAD_PB28].FUNC_CTL=IOC_PB28_FUNC_CTL_EUI1_DI;
HPM_IOC->PAD[IOC_PAD_PB29].FUNC_CTL=IOC_PB29_FUNC_CTL_EUI1_DO;
}else{
;
}
}

eui初始化函數
staticvoidinit_eui_config(void)
{
eui_ctrl_config_tctrl_config;
eui_get_default_ctrl_config(BOARD_EUI,&ctrl_config);
ctrl_config.work_mode=eui_work_mode_8x8;
ctrl_config.clko_freq_khz=100;
ctrl_config.key_filter_ms=50;
ctrl_config.disp_data_invert=0xFF;
ctrl_config.scan_invert=0x00;
ctrl_config.dedicate_out_cfg=BOARD_EUI_DEDICATE_OUT_LINES;
ctrl_config.dedicate_in_cfg=0x0000;
eui_config_ctrl(BOARD_EUI,s_eui_clock_freq,&ctrl_config);
printf("clko_tm_us:%d, slot_tm_us:%d, hold_tm_us:%d, disp_tm_us:%d, filter_tm_us:%d\n\n",
eui_get_time_us(BOARD_EUI,s_eui_clock_freq,eui_clko_time),eui_get_time_us(BOARD_EUI,s_eui_clock_freq,eui_slot_time),
eui_get_time_us(BOARD_EUI,s_eui_clock_freq,eui_hold_time),eui_get_time_us(BOARD_EUI,s_eui_clock_freq,eui_disp_time),
eui_get_time_us(BOARD_EUI,s_eui_clock_freq,eui_filter_time));
eui_set_irq_enable(BOARD_EUI,eui_irq_area_mask);
intc_m_enable_irq_with_priority(BOARD_EUI_IRQ,1);
eui_set_enable(BOARD_EUI,true);
}
1.3 運行效果


二、16位ADC采樣實驗
HPM5E00支持高達16位的ADC采樣。
SDK中提供了ADC采樣示例位于:sdk_env_v1.10.0\hpm_sdk\samples\drivers\adc\adc16
本文對示例做適當修改,將采集數據轉換為電壓并通過LED數碼管顯示。
2.1 生成工程

2.2 軟件部分
1、初始化oneshot模式
voidinit_oneshot_config(void)
{
adc16_channel_config_tch_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);
adc16_set_nonblocking_read(BOARD_APP_ADC16_BASE);
#ifdefined(ADC_SOC_BUSMODE_ENABLE_CTRL_SUPPORT)&&ADC_SOC_BUSMODE_ENABLE_CTRL_SUPPORT
/* enable oneshot mode */
adc16_enable_oneshot_mode(BOARD_APP_ADC16_BASE);
#endif
}
2、EUI設備初始化及數碼管顯示電壓數值函數
#include"board.h"
#include"hpm_eui_drv.h"
#include"hpm_interrupt.h"
#include"hpm_clock_drv.h"
#include"common.h"
staticconstuint8_ts_disp_code_8_seg[]=BOARD_EUI_SEG_ENCODE_DATA;
staticuint32_ts_eui_clock_freq;
voidinit_eui_config(void)
{
eui_ctrl_config_tctrl_config;
clock_add_to_group(BOARD_EUI_CLOCK_NAME,0);
s_eui_clock_freq=clock_get_frequency(BOARD_EUI_CLOCK_NAME);
eui_get_default_ctrl_config(BOARD_EUI,&ctrl_config);
ctrl_config.work_mode=eui_work_mode_8x8;
ctrl_config.clko_freq_khz=100;
ctrl_config.key_filter_ms=50;
ctrl_config.disp_data_invert=0xFF;
ctrl_config.scan_invert=0x00;
ctrl_config.dedicate_out_cfg=BOARD_EUI_DEDICATE_OUT_LINES;
ctrl_config.dedicate_in_cfg=0x0000;
eui_config_ctrl(BOARD_EUI,s_eui_clock_freq,&ctrl_config);
/*
printf("clko_tm_us:%d, slot_tm_us:%d, hold_tm_us:%d, disp_tm_us:%d, filter_tm_us:%d\n\n",
eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_clko_time), eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_slot_time),
eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_hold_time), eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_disp_time),
eui_get_time_us(BOARD_EUI, s_eui_clock_freq, eui_filter_time));
eui_set_irq_enable(BOARD_EUI, eui_irq_area_mask);
intc_m_enable_irq_with_priority(BOARD_EUI_IRQ, 1);
*/
eui_set_enable(BOARD_EUI,true);
}
voidadc_led_disp(uint16_tval)
{
floatf_val=val*3.3/65535;
printf("f_val:%f\r\n",f_val);
eui_scan_disp_data_tdisp_data;
disp_data.data_8x8[0]=s_disp_code_8_seg[((uint16_t)f_val)%10]|BOARD_EUI_SEG_DP_BIT_MASK;
disp_data.data_8x8[1]=s_disp_code_8_seg[((uint16_t)(f_val*10))%10];
disp_data.data_8x8[2]=s_disp_code_8_seg[((uint16_t)(f_val*100))%10];
disp_data.data_8x8[3]=s_disp_code_8_seg[((uint16_t)(f_val*10000))%10];
disp_data.data_8x8[4]=s_disp_code_8_seg[((uint16_t)(f_val*100000))%10];
eui_set_scan_disp_data(BOARD_EUI,0,&disp_data);
}
3、oneshot采集處理,增加了調用adc_led_disp函數部分
voidoneshot_handler(void)
{
uint16_tresult;
if(adc16_get_oneshot_result(BOARD_APP_ADC16_BASE,BOARD_APP_ADC16_CH_1,&result)==status_success){
if(adc16_is_nonblocking_mode(BOARD_APP_ADC16_BASE)){
adc16_get_oneshot_result(BOARD_APP_ADC16_BASE,BOARD_APP_ADC16_CH_1,&result);
}
printf("Oneshot Mode - %s [channel %02d] - Result: 0x%04x\n",BOARD_APP_ADC16_NAME,BOARD_APP_ADC16_CH_1,result);
adc_led_disp(result);
}
board_delay_ms(500);
}
4、EUI初始化
init_eui_pins(BOARD_EUI);
init_eui_config();
5、采集通道修改
從原理圖上可以看出ADC對應管腳PF18(ADC_IN11)
所以需要將BOARD_APP_ADC16_CH_1修改為11U



修改
#defineBOARD_APP_ADC16_CH_1 (11U)
2.3 運行效果
串口輸出

在跳冒斷開的情況下,手觸碰jp7,可以改變PF18輸入電壓,可以看到數碼管顯示電壓隨之改變。

三、SDM對Σ-Δ調制器輸出數據采樣
3.1 引言
SDM(Sigma-Delta Modulator)是Σ?信號接收單元(Σ?Modulator)。
Σ-Δ電流采樣優點是容易實現模擬隔離采樣:主回路的開關噪聲對控制電路干擾大,會影響系統穩定性和控制精度,隔離Σ-Δ采樣可以實現控制與主回路隔離。隔離Σ-Δ轉換器是采用脈沖輸出方式傳輸信號,通過數字隔離芯片的原理實現隔離,較模擬隔離成本低而且失真小。
HPM5E00提供SDM模塊具有以下特點:
信號輸入接口:
- 4組獨立的CLK和DAT信號輸入
- 每組CLK/DAT可獨立配置采樣模式
- 支持多種采樣模式:
- Mode 0: MCLK上升沿采樣
- Mode 1: MCLK上升沿和下降沿采樣
- Mode 2: Manchester編碼模式
- Mode 3: MCLK下降沿采樣
- Mode 4: 每2個MCLK上升沿采樣
- Mode 5: 每2個MCLK下降沿采樣
- 數據濾波器(PCM_CIC):
- 支持4種濾波器類型:
- Sinc1 (1階)
- Sinc2 (2階)
- Sinc3 (3階)
- SincFast (2階快速)
- 可配置過采樣率(1-256)
- 內置16深度32bit寬度FIFO
- 支持同步采樣
- 支持掩碼控制(指定版本)
- 可選時間戳輸出功能(指定版本)
- 幅值檢測器(AMP_CIC):
- 同樣支持4種濾波器類型
- 獨立的幅值監測通道
- 支持高/低門限檢測
- 支持過零檢測
- 可配置過采樣率(1-32)
- 實時幅值輸出
- 中斷支持:
- FIFO閾值中斷
- 數據溢出中斷
- 數據飽和中斷
- 幅值超限中斷
- 同步功能:
- 支持TRGMUX觸發輸入
- 支持TRGMUX觸發輸出
3.2 數據寄存器
開發板上已經集成了NSI1306。NSI1306是一款高性能Σ-Δ調制器,基于NOVOSENSE電容隔離技術,其輸出與輸入分離。該器件的線性差分輸入信號范圍為±50mV(滿量程±64mV)或±250mV范圍(滿量程±320mV)。差分輸入非常適合需要隔離的高壓應用中基于分流電阻的電流檢測。模擬輸入經過放大,并由二階Σ-Δ調制器連續采樣,然后轉換為高速,單比特數據流。輸出數據與外部時鐘同步,時鐘上升沿有效,頻率范圍為5MHz至21MHz。通過使用適當的數字濾波器(例如sinc3濾波器)來抽取比特流,該器件可以在78.125KPS的條件下以20MHz的主時鐘實現16位分辨率和86dB/82.5dB信噪比(SNR)。故障安全功能包括輸入共模過壓檢測和VDD1缺失檢測,簡化了系統設計和診斷。
NSI1306管腳圖

在CLKIN上升沿時通過DOUT采集數據

開發板原理圖SDM連接圖

SDM使用了PF16、PF17管腳

為了進行實驗,外部接入如下分壓電路,用于測量電池分壓后的結果

3.3 軟件部分
SDK示例中提供了四種工作模式演示:1. 輪詢模式采樣;2. 幅值檢測模式;3. 中斷模式采樣;4. 同步信號采樣模式
下面主要解讀輪詢模式采樣模式。
(1) SDM 模塊初始化
sdm_get_default_module_control(TEST_SDM,&control);
sdm_init_module(TEST_SDM,&control);
初始化 SDM 模塊,配置時鐘同步、數據同步。
(2) 通道配置
ch_config.sampling_mode=sdm_sampling_rising_clk_edge;
ch_config.enable_err_interrupt=false;
ch_config.enable_data_ready_interrupt=false;
sdm_config_channel_common_setting(TEST_SDM,TEST_SDM_CHANNEL,&ch_config);
采樣模式:在時鐘上升沿采樣(與 NSI1306 的 Σ-Δ 輸出同步)。
中斷配置:禁用錯誤中斷和數據就緒中斷(使用輪詢模式)。
(3) 數字濾波器配置
filter_config.filter_type=sdm_filter_sinc3;
filter_config.oversampling_rate=256;
filter_config.ignore_invalid_samples=2;
sdm_config_channel_filter(TEST_SDM,TEST_SDM_CHANNEL,&filter_config);
濾波器類型:Sinc3 濾波器(適合 Σ-Δ 調制器,抑制高頻噪聲)。
過采樣率 (OSR):256(提高分辨率,但降低帶寬)。
無效樣本忽略:跳過前 2 個樣本(避免初始不穩定數據)。
(4) 數據采集與轉換
do{
stat=sdm_receive_filter_data(TEST_SDM,TEST_SDM_CHANNEL,true,(int8_t*)filter_result,TEST_DATA_COUNT,4U);
}while(stat!=status_success);
doublevoltage=sdm_data_value_to_voltage(&filter_config,filter_result[i]);
輪詢數據:從 FIFO 讀取 32 位濾波后的數據(filter_result 為緩沖區)。
電壓轉換:將原始數據轉換為實際電壓值。
3.4運行效果
串口輸出采集結果:

采集結果約為14.74mV
根據分壓可以算出電池電壓:1010*14.74/10=1488.74mV≈1.49V
四、外置SRAM模擬為U盤
SDK中有PPI接口驅動外置SRAM和TinyUSB模擬2個MSC大容量設備的例子。將2者結合可以將外置SRAM(256KB容量)虛擬為U盤。
原示例位于:
sdk_env_v1.10.0\hpm_sdk\samples\tinyusb\device\msc_dual_lun
4.1 軟件部分
1、main函數增加
clock_add_to_group(clock_ppi0,0);
init_ppi_pins();
init_sram_config();
init_pmp_for_ppi();
init_disk(0xF8000000);
init_ppi_pins為板級函數,初始化PPI引腳以驅動外置SRAM
init_sram_config、init_pmp_for_ppi函數均可在
sdk_env_v1.10.0\hpm_sdk\samples\drivers\ppi\async_sram示例中找到
init_disk為將msc_disk1指向外置SRAM區域,用來虛擬U盤空間,這個函數需要在外置SRAM就位后調用。
msc_disk1為指向數組的指針。
uint8_t (*msc_disk1)[DISK_BLOCK_SIZE];
init_disk函數,diskinfo中有3個BLOCK(512字節*3)為FAT文件結構,需要拷貝到msc_disk1中,msc_disk1的其他部分需清零
voidinit_disk(uint32_tstart){
// Cast the start address to our disk pointer type
msc_disk1=(uint8_t(*)[DISK_BLOCK_SIZE])start;
// Copy the disk info to the disk memory
memcpy(msc_disk1,diskinfo,3*DISK_BLOCK_SIZE);
memset(msc_disk1+3,0,(512-3)*DISK_BLOCK_SIZE);
}
2、TinyUSB模擬MSC設備部分(msc_disk_dual.c)
diskinfo為FAT文件系統定義,對原示例進行了修改。
diskinfo位于flash區域,非內存,需要在外置SRAM就位后,copy到msc_disk1中
block2、block3相同為FAT12表
staticconstuint8_tdiskinfo[4][DISK_BLOCK_SIZE]=
{
{
0xEB,0x3C,0x90,0x4D,0x53,0x44,0x4F,0x53,0x35,0x2E,0x30,0x00,0x02,0x01,0x01,0x00,
0x02,0x10,0x00,0x00,0x02,0xF8,0x02,0x00,0x01,0x00,0x01,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x80,0x00,0x29,0x78,0x56,0x00,0x00,'T','i','n','y','U',
'S','B',' ','1',' ',' ',0x46,0x41,0x54,0x31,0x32,0x20,0x20,0x20,0x00,0x00,
/* Zero up to 2 last bytes of FAT magic code */
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xAA
},
/*------------- Block1: FAT12 Table -------------*/
{
0xF8,0xFF,0xFF,0xFF,0x0F,0x00,0x00// // first 2 entries must be F8FF, third entry is cluster end of readme file
},
/*------------- Block2: FAT12 Table -------------*/
{
0xF8,0xFF,0xFF,0xFF,0x0F,0x00,0x00// // first 2 entries must be F8FF, third entry is cluster end of readme file
},
}
tud_msc_capacity_cb函數
主要對lun進行判斷,當0時第一U盤,返回DISK_BLOCK_NUM*DISK_BLOCK_SIZE(32*512=16kb),當1時第二U盤,返回512*512=256kb
voidtud_msc_capacity_cb(uint8_tlun,uint32_t*block_count,uint16_t*block_size)
{
(void)lun;
if(lun==0)
{
*block_count=DISK_BLOCK_NUM;
*block_size =DISK_BLOCK_SIZE;
}elseif(lun==1)
{
*block_count=512;
*block_size =DISK_BLOCK_SIZE;
}
printf("tud_msc_capacity_cb:%d\r\n",lun);
}
其他主要TingUSB接口函數未做修改
tud_msc_read10_cb
tud_msc_write10_cb
tud_msc_scsi_cb
4.2 運行效果
1、插上外置板卡
SRAM位于外置板卡上

2、斷開JP6
根據SDK說明,為了使PPI工作,斷開JP6

3、Type-C連接開發板J1(USB)和PC機
可以看到新識別了2個U盤,其中E盤為原示例中第一個U盤位做修改,第二U盤為外置SRAM模擬的U盤,容量大概256KB

E:的內容,F:是空的

設備管理中也可以看到這2個U盤

五、EtherCat io示例實踐
對于一個陌生的技術,按照示例按部就班地實現無疑是一個很多好的學習方法。
在完成本次實驗前,筆者沒有接觸過EtherCat,所有行文中有錯誤和不當之處在所難免。
本文記錄EtherCat io示例運行環境搭建及演示。
例程位于
sdk_env_v1.10.0\hpm_sdk\samples\ethercat\ecat_io
5.1 環境準備
1、SSC ToolV5.13
因為SDK中的配置采用的是V51.3,所以一定不要用其他版本。
因為Beckhoff官網只給企業用戶提供下載用戶,因此花了一些時間找到一個下載地址:
https://gitcode.com/open-source-toolkit/a3990/?utm_source=tools_gitcode&index=top&type=href&
SSC Tool主要的作用是生成EtherCAT從站協議棧代碼。
2、TwinCAT 3
可以從倍福(中國)官方下載,需要注冊
地址:
https://www.beckhoff.com.cn/zh-cn/support/download-finder/search-result/?c-1=26782567
下載中心中查找:TwinCAT 3 download | eXtended Automation Engineering (XAE) 1.4G
下載后文件為TC31-FULL-Setup.3.1.4024.67.exe,注意安裝時要以管理員身份運行。

TwinCAT在本例中主要起到EEPROM更新,控制EtherCAT從站的作用。
3、patch
示例中SSC協議棧代碼修改用到了patch工具,所以需要安裝patch,然后將patch路徑加到系統路徑中
patch下載地址:
https://gnuwin32.sourceforge.net/packages/patch.htm
5.2 示例構建
1、用start_gui工具生成工程

2、SSC tool生成EtherCAT從站協議棧代碼
new->import->HPM_ECAT_IO_Config.xml
import后,SSC tool可以支持HPM代碼的生成

tool->import->Application->digital_io.xlsx

Project->Create new Slave ***生成從站協議棧代碼

3、SSC協議棧代碼修改
sdk_env_v1.10.0\hpm_sdk\samples\ethercat\ecat_io下
運行patch -d Src < ssc_pdi_mask.patch
4、用SEGGER Embedded Studio 8.24打開工程,編譯下載到開發板
5、TwinCAT工程設置
下面只列出一些主要工作,詳見gitee的官方SDK說明:https://gitee.com/hpmicro/hpm_sdk/tree/main/samples/ethercat/ecat_io
1)將ESI文件
(sdk_env_v1.10.0\hpm_sdk\samples\ethercat\ecat_io\SSC\ESIECAT-IO.xml )復制到TwinCAT的安裝目錄下(如: C:/TwinCAT/3.1/Config/Io/EtherCAT )。
2)運行TwinCAT XAE Shell,打開TwinCAT軟件,選擇 File->New->project,新建工程
3)首次使用更新網卡驅動
4)時鐘設置
管理員身份運行
C:\TwinCAT\3.1\System\win8settick.bat
5)掃描設備
掃描設備前,開發板應和PC機通過雙絞線連接
6)更新EEPROM
7) IO操作
5.3 軟件方面


APPL_Application函數被EtherCat中斷調用,執行gpio輸入判斷和LED點亮操作
voidAPPL_Application(void)
{
InputCounter0x6000=APPL_GetDipSw();
APPL_SetLed((UINT32)OutputCounter0x7010);
}
LED點亮函數
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);
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輸入判斷函數
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);
UINT32 val=pin0_level<<0|pin1_level<<1;
returnval;
}
5.4 運行
1、雙絞線連接PC機

2、ECAT交互區

示例運行演示視頻:
https://www.bilibili.com/video/BV1YJGgzYEA6/?share_source=copy_web&vd_source=7258d8aa5251054c1d4c51d8c4cc2a02
文章來源:EEFocus
開發者ID:eefocus_3941691
原文鏈接:
https://www.eefocus.com/forum/home.php?mod=space&uid=378371&do=thread&view=me&from=space
/
完
/
以上內容來自先楫開發者的原創分享。
我們始終相信開發者共創的力量。先楫社區堅持開源共享、互惠互利,貼近每一個開發者,一步一個腳印,一點一滴積累,為成為更好的我們而不斷努力。
心之所向,銳意進取,星辰大海,恣意成長。
-
adc
+關注
關注
100文章
7511瀏覽量
555912 -
工業
+關注
關注
3文章
2360瀏覽量
49192 -
SDM
+關注
關注
0文章
11瀏覽量
8063 -
ethercat
+關注
關注
19文章
1507瀏覽量
45169
發布評論請先 登錄
開發者分享 | 一次完整的 HPM EtherCAT 實戰:環境、通信與極限測試
【強勢上新】HPM5E00:EtherCAT運動控制MCU,先楫半導體再拓工業總線產品新版圖
有獎提問!先楫半導體HPM6E00系列新品發布會!!
先楫HPM6E00技術日 | 百人研討共話工業應用創新及發展趨勢
先輯半導體HPM6E00系列產品能用來做EtherCAT的主站嗎
HPM5E00EVK,ecat_io例程,卡在DisableSyncManChannel函數
HPM6E00EVKRevC開發板32位RISC-V架構
上新?|?HPM6E80高壓伺服EtherCAT驅動器方案
【強勢上新】HPM5E00:EtherCAT運動控制MCU,先楫半導體再拓工業總線產品新版圖
支持HPM6P00/HPM5E00系列!HPMicro Manufacturing Tool v0.6.0發布
重磅更新 | HPM_SDK v1.10.0 發布
開發者分享 | 基于HPM5E31的LuckyCAT工業嵌入式開發板
開發者分享 | HPM5E-EC-DEV:基于HPM5E00的EtherCAT開發板分享
先楫解決方案 | 變頻器EtherCAT通訊卡+遠程IO方案
開發者分享 | 構建完整控制系統:HPM5E00 外設綜合應用
開發者分享 | 面向工業應用的 HPM5E00 實踐:ADC、SDM 與 EtherCAT
評論