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

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

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

英創(chuàng)信息技術(shù)脈沖計(jì)數(shù)功能在ESM335x-Linux主板上的實(shí)現(xiàn)

英創(chuàng)信息技術(shù) ? 來(lái)源:英創(chuàng)信息技術(shù) ? 作者:英創(chuàng)信息技術(shù) ? 2020-02-04 10:34 ? 次閱讀

1、綜述

工業(yè)控制中,經(jīng)常需要獲取脈沖信號(hào)計(jì)數(shù)值、頻率、周期、占空比等參數(shù)。英創(chuàng)嵌入式主板ESM335X系列 Linux系統(tǒng)現(xiàn)已實(shí)現(xiàn)外部輸入脈沖信號(hào)的計(jì)數(shù)、頻率、周期、占空比測(cè)量功能。

主要功能及技術(shù)指標(biāo)如下:

1、讀取一段時(shí)間內(nèi)的外部輸入脈沖信號(hào)計(jì)數(shù)值。

2、外部輸入脈沖信號(hào)周期、有效脈寬測(cè)量。

3、根據(jù)測(cè)得周期計(jì)算外部輸入脈沖信號(hào)瞬時(shí)頻率。

4、根據(jù)測(cè)得計(jì)數(shù)值和測(cè)量時(shí)間間隔計(jì)算兩次有效信號(hào)讀取時(shí)間內(nèi)外部輸入脈沖信號(hào)重復(fù)頻率(平均頻率)。

5、測(cè)得誤差200KHz左右時(shí)最大,瞬時(shí)頻率誤差不超過(guò)0.1%,重復(fù)頻率誤差不超過(guò)0.005%,占空比誤差不超過(guò)0.05%,計(jì)數(shù)值測(cè)量準(zhǔn)確無(wú)誤差。

2、硬件連接

ESM335X系列嵌入式主板引出了3路PWM輸出,其中兩路(PWM1和PWM2)可以用來(lái)進(jìn)行外界輸入的脈沖信號(hào)計(jì)數(shù)、頻率、占空比測(cè)量,相應(yīng)的GPIO復(fù)用腳為GPIO6和GPIO7, 對(duì)應(yīng)的引腳請(qǐng)參考光盤(pán)資料《ESMARC 335x工控主板數(shù)據(jù)手冊(cè)》,用戶(hù)使用脈沖波輸入計(jì)數(shù)功能時(shí)可將外來(lái)信號(hào)接到上述兩個(gè)GPIO管腳中的任意一個(gè),并且地線(xiàn)與開(kāi)發(fā)板接地引腳相連,然后在應(yīng)用程序中獲得計(jì)數(shù)值、頻率、占空比。若用戶(hù)啟用了脈沖輸入計(jì)數(shù)功能,則相應(yīng)管腳不能再作為PWM脈沖輸出或GPIO使用。

使用注意事項(xiàng):

1、GPIO管腳最大只允許輸入3.3V電壓,超過(guò)將會(huì)導(dǎo)致開(kāi)發(fā)板損壞!以開(kāi)發(fā)板接地腳為基準(zhǔn),負(fù)值電壓無(wú)效,不符合電壓要求時(shí)需要設(shè)計(jì)緩沖放大電路。

2、輸入脈沖波最大頻率不應(yīng)超過(guò)200KHz!超過(guò)之后由于硬件限制測(cè)量誤差將急劇變大。

3、應(yīng)用程序

為了簡(jiǎn)化用戶(hù)使用脈沖計(jì)數(shù)功能,內(nèi)部使用了原pwm輸出模塊,Linux系統(tǒng)內(nèi)部沒(méi)有增加新的設(shè)備節(jié)點(diǎn),使用設(shè)備的計(jì)數(shù)功能(capture模式,后文簡(jiǎn)稱(chēng)cap),仍然需要使用pwm模式的設(shè)備節(jié)點(diǎn)進(jìn)行模塊功能設(shè)置。

(1)程序中使用到的結(jié)構(gòu)體及常量定義

與內(nèi)核直接交換數(shù)據(jù)讀取設(shè)備原始測(cè)量值的結(jié)構(gòu)體為cap_config_info,應(yīng)用于read、write函數(shù):

typedef struct cap_config_info

{

//以下為輸入?yún)?shù)

unsigned intdwPolarity;//設(shè)置輸入信號(hào)極性

unsigned intdwMaxFreq;//設(shè)置輸入信號(hào)最大頻率

//以下為輸出參數(shù),輸入無(wú)效

unsigned longdwTimeUs;//兩次讀取之間的時(shí)間差

unsigned intdwCount;//兩次讀取之間的計(jì)數(shù)值

unsigned intdwPeriodNs;//讀取時(shí)刻脈沖周期

unsigned intdwWidthNs;//讀取時(shí)刻的脈沖有效脈寬

}CAP_INFO, *PCAP_INFO;

1、dwPolarity用于設(shè)置輸入脈沖信號(hào)極性,可設(shè)為PWM_POLARITY_NORMAL和PWM_POLARITY_INVERTED,定義在pwm_api.h頭文件中。

2、dwMaxFreq等于0時(shí)用于停止計(jì)數(shù)功能,dwMaxFreq不為零時(shí)用于設(shè)置輸入信號(hào)最大頻率,最大頻率不應(yīng)超過(guò)200KHz,輸入單位為Hz。

3、dwTimeUs為輸出參數(shù),讀取獲得上次讀操作(或使能操作)到本次讀操作之間的時(shí)間差,單位為us。

4、dwCount為輸出參數(shù),讀取獲得上次讀操作(或使能操作)到本次讀操作之間的計(jì)數(shù)值,單位為 個(gè)。

5、dwPeriodNs為輸出參數(shù),讀取獲得本次讀操作時(shí)脈沖信號(hào)周期, 單位為ns。

6、dwWidthNs為輸出參數(shù),讀取獲得本次讀操作時(shí)脈沖信號(hào)有效脈沖寬度,單位為ns。

7、用戶(hù)可根據(jù)dwPeriodNs和dwWidthNs計(jì)算占空比。

8、用戶(hù)可根據(jù)dwPeriodNs計(jì)算讀操作時(shí)的脈沖信號(hào)頻率。

9、用戶(hù)可根據(jù)dwTimeUs和dwCount計(jì)算兩次讀操作之間的輸入信號(hào)的平均頻率。

(2)函數(shù)及系統(tǒng)調(diào)用

在進(jìn)行計(jì)數(shù)操作時(shí),首先打開(kāi)相應(yīng)的設(shè)備節(jié)點(diǎn)/dev/em335x_pwmX,X為編號(hào)(1或者2),使能設(shè)備開(kāi)始計(jì)數(shù)相關(guān)代碼:

a)打開(kāi)設(shè)備節(jié)點(diǎn):

intnpwm = 1;

sprintf( device, "/dev/em335x_pwm%d", npwm );

fd = open(device, O_RDWR);

if ( fd < 0)

{

printf("can not open /dev/em335x_pwm%d device file! ", npwm);

return -1;

}

printf( "Open %s ", device );

b)使能cap模式:

int CAP_Start(int fd, unsigned int polarity, unsigned int maxfreq )

{

int rc;

struct cap_config_infoconf;

memset(&conf, 0 ,sizeof(struct cap_config_info))

conf.dwPolarity = polarity;

conf.dwMaxFreq = maxfreq;

rc = write(fd, &conf, sizeof(struct cap_config_info));

if ( rc == 0 )

return rc;

else

{

printf( " config for cap model failed! ");

exit(1);

}

}

用戶(hù)只需要調(diào)用此函數(shù)即可使能脈沖信號(hào)計(jì)數(shù)功能,并且計(jì)數(shù)功能開(kāi)始計(jì)數(shù)。也可自己設(shè)置參數(shù)調(diào)用write使能cap模式。如:

#include "pwm_api.h"

unsigned intpolarity = PWM_POLARITY_NORMAL;

unsigned intmaxfreq = 200000000;

CAP_Start( fd, polarity, maxfreq );

c)在計(jì)數(shù)過(guò)程中可以調(diào)用read函數(shù)或者我們提供的CAP_Read函數(shù)讀取測(cè)量數(shù)值:

int CAP_Read(int fd, struct cap_config_info* conf )

{

printf ( "reading^^^^^^^ " );

int rc;

rc = read(fd, conf, sizeof(struct cap_config_info));

return rc;

}

用戶(hù)可根據(jù)自己需要在任意時(shí)刻選擇調(diào)用此函數(shù)或者直接調(diào)運(yùn)read獲取測(cè)量值。

根據(jù)測(cè)量值可以計(jì)算脈沖頻率并轉(zhuǎn)換單位,注意測(cè)得dwCount小于2時(shí)其他參數(shù)均無(wú)效:

doublePeriodUs;//單位us

doubleWidthUs;//單位us

doubleDuty;//單位%

intCount;//個(gè)數(shù)

doubleFreq;//單位Hz

doubleAVGFreq;//單位Hz

unsigned int TimeUs;//單位us

CAP_Read ( fd, &conf );

Count = conf.dwCount;

if(Count>1)

{

PeriodUs = (double)conf.dwPeriodNs/1000.0;//單位轉(zhuǎn)換

WidthUs = (double)conf.dwWidthNs/1000.0;

Duty = (double)conf.dwWidthNs*100000.0/conf.dwPeriodNs;

Freq = CAP_CLK_FREQ/(double)conf.dwPeriodNs;

AVGFreq = (double)conf.dwCount*CAP_CLK_FREQ/(double)conf.dwTimeUs;

}

else

{

PeriodUs = 0;

WidthUs = 0;

Duty = 0;

Freq = 0;

AVGFreq = 0;

}

d)使用完成后需要關(guān)閉計(jì)數(shù)功能,同樣可以自行設(shè)置參數(shù)調(diào)用write或者使用CAP_Stop,也可以直接使用close關(guān)閉設(shè)備節(jié)點(diǎn)同事停止使用計(jì)數(shù)功能:

int CAP_Stop(int fd )

{

printf ( "stopping^^^^^^^ " );

int rc;

struct cap_config_infoconf;

memset( &conf, 0, sizeof(struct pwm_config_info));

conf.dwMaxFreq = 0;

rc = write(fd, &conf, sizeof(struct cap_config_info));

return rc;

}

調(diào)用上述函數(shù):

CAP_Stop( fd);

使用完成后需要關(guān)閉設(shè)備節(jié)點(diǎn)。

close(fd);

e)觸發(fā)機(jī)制(選讀):

如下圖所示,在每一次上升沿或者下降沿處會(huì)觸發(fā)硬件捕獲功能,獲得輸入脈沖信號(hào)的參數(shù)并保存,應(yīng)用程序中在任意時(shí)刻調(diào)用讀操作得到的數(shù)據(jù)是最近一次上升沿或下降沿處的數(shù)據(jù)。此圖中調(diào)用read1一之后調(diào)用read2,得到的計(jì)數(shù)值為2,時(shí)間差為(硬件觸發(fā)2-硬件觸發(fā)1)的時(shí)間差。用戶(hù)使用時(shí)請(qǐng)注意輸入信號(hào)有效時(shí)間段。所得時(shí)間不能作為兩次讀操作之間的時(shí)間差使用。如果要將讀取的時(shí)間值作為兩次讀操作的時(shí)間值需要在前一次讀操作后調(diào)用CAP_Start或直接用write函數(shù)傳遞相同參數(shù)清零硬件保存值。

4、實(shí)驗(yàn)測(cè)量

由于硬件的限制,測(cè)得瞬時(shí)頻率、周期、占空比精度有限。硬件操作使用的時(shí)鐘信號(hào)為100MHz,即周期、有效脈寬時(shí)間只能得到高于10ns的數(shù)值。平均頻率的測(cè)量需要保證整個(gè)測(cè)量時(shí)間段內(nèi)輸入脈沖信號(hào)一直有脈沖輸入!平均頻率的誤差整個(gè)測(cè)量范圍內(nèi)不超過(guò)10Hz。實(shí)驗(yàn)使用RIGOL DG1022 信號(hào)發(fā)生器作為外部脈沖信號(hào)源,可以調(diào)整信號(hào)周期占空比,設(shè)置一定時(shí)間內(nèi)的脈沖個(gè)數(shù)。

頻率測(cè)量(kHz):

輸入 200.000 197.000 97.000 1.020
瞬間頻率 200.000 196.850 96.993 1.020
平均頻率 199.992 196.992 96.998 1.020

測(cè)得瞬時(shí)數(shù)據(jù)誤差隨頻率增加而變大,具體數(shù)據(jù)可根據(jù)測(cè)量時(shí)間最小值10NS進(jìn)行計(jì)算。

在150KHz時(shí)測(cè)量的不同占空比值如下表:

輸入% 90.00 50.00 20.00 10.00
測(cè)得% 89.96 50.00 19.97 9.91

在100KHz時(shí)測(cè)量的不同占空比值如下表:

輸入% 90.00 50.00 20.00 10.00
測(cè)得% 90.00 50.00 20.00 10.00

在100KHz時(shí)連續(xù)測(cè)量的1S內(nèi)脈沖個(gè)數(shù)如下表(信號(hào)源輸入個(gè)數(shù)設(shè)置模式上限50K個(gè),通過(guò)設(shè)置信號(hào)源取不同輸入值):

輸入% 39 999 23 338 8 766 432
測(cè)得% 39 999 23 338 8 766 432

注:當(dāng)頻率升高時(shí),系統(tǒng)高負(fù)荷運(yùn)轉(zhuǎn),實(shí)際讀取時(shí)間差變化加大,如果連續(xù)讀取,讀到的計(jì)數(shù)值要以讀到的時(shí)間差為準(zhǔn)進(jìn)行數(shù)值判斷,實(shí)際讀取個(gè)數(shù)并無(wú)誤差。

計(jì)數(shù)值在允許輸入頻率內(nèi)無(wú)誤差。

如果需要使用此功能或有任何疑問(wèn),請(qǐng)和我們聯(lián)系。

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

    關(guān)注

    87

    文章

    11182

    瀏覽量

    208523
  • 嵌入式主板
    +關(guān)注

    關(guān)注

    7

    文章

    6083

    瀏覽量

    35115
收藏 人收藏

    評(píng)論

    相關(guān)推薦

    適用于AM335x TRF7970A的neard(Linux NFC)構(gòu)建說(shuō)明

    電子發(fā)燒友網(wǎng)站提供《適用于AM335x TRF7970A的neard(Linux NFC)構(gòu)建說(shuō)明.pdf》資料免費(fèi)下載
    發(fā)表于 10-26 11:00 ?0次下載
    適用于AM<b class='flag-5'>335x</b> TRF7970A的neard(<b class='flag-5'>Linux</b> NFC)構(gòu)建說(shuō)明

    在TMS320DM335 DMSoC實(shí)現(xiàn)DDR2/mDDR PCB布局

    電子發(fā)燒友網(wǎng)站提供《在TMS320DM335 DMSoC實(shí)現(xiàn)DDR2/mDDR PCB布局.pdf》資料免費(fèi)下載
    發(fā)表于 10-15 09:14 ?0次下載
    在TMS320DM<b class='flag-5'>335</b> DMSoC<b class='flag-5'>上</b><b class='flag-5'>實(shí)現(xiàn)</b>DDR2/mDDR PCB布局

    AM335x功耗估算工具

    電子發(fā)燒友網(wǎng)站提供《AM335x功耗估算工具.pdf》資料免費(fèi)下載
    發(fā)表于 10-12 11:46 ?0次下載
    AM<b class='flag-5'>335x</b>功耗估算工具

    創(chuàng)國(guó)產(chǎn)化背景下的工控主板發(fā)展現(xiàn)狀

    創(chuàng),是信息技術(shù)應(yīng)用創(chuàng)新產(chǎn)業(yè)的簡(jiǎn)稱(chēng),于2016年“信創(chuàng)工委會(huì)”(信息技術(shù)應(yīng)用創(chuàng)新工作委員會(huì))提出,目的就是要推動(dòng)我們國(guó)內(nèi)軟硬件關(guān)鍵技術(shù)的研發(fā)
    的頭像 發(fā)表于 09-21 16:15 ?226次閱讀

    AM335x硬件設(shè)計(jì)指南

    電子發(fā)燒友網(wǎng)站提供《AM335x硬件設(shè)計(jì)指南.pdf》資料免費(fèi)下載
    發(fā)表于 09-19 11:05 ?0次下載
    AM<b class='flag-5'>335x</b>硬件設(shè)計(jì)指南

    高速脈沖數(shù)據(jù)采集如何實(shí)現(xiàn)

    人員的青睞。對(duì)此,物通博聯(lián)提供高速脈沖數(shù)據(jù)采集的IOT解決方案,實(shí)現(xiàn)低成本、高效率的項(xiàng)目搭建。 物通博聯(lián)推出的工業(yè)數(shù)采終端支持脈沖計(jì)數(shù)功能,能夠實(shí)現(xiàn)
    的頭像 發(fā)表于 08-26 17:31 ?338次閱讀
    高速<b class='flag-5'>脈沖</b>數(shù)據(jù)采集如何<b class='flag-5'>實(shí)現(xiàn)</b>

    具有脈沖計(jì)數(shù)接口的 LMT01-Q1 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《具有脈沖計(jì)數(shù)接口的 LMT01-Q1 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-13 09:20 ?0次下載
    具有<b class='flag-5'>脈沖計(jì)數(shù)</b>接口的 LMT01-Q1 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表

    具有脈沖計(jì)數(shù)接口的 LMT01 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《具有脈沖計(jì)數(shù)接口的 LMT01 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-13 09:19 ?0次下載
    具有<b class='flag-5'>脈沖計(jì)數(shù)</b>接口的 LMT01 0.5°C 精度雙引腳數(shù)字輸出溫度傳感器數(shù)據(jù)表

    esp8266的脈沖計(jì)數(shù)問(wèn)題求解

    我正在編寫(xiě) nodemcu esp8266 的代碼,它涉及脈沖計(jì)數(shù)、存儲(chǔ)和返回 nodemcu,使用 raspberry pi 作為服務(wù)器。為此,我使用了 3 個(gè) nodemcu esp8266
    發(fā)表于 07-10 06:49

    脈沖計(jì)數(shù)器的工作原理和基本結(jié)構(gòu)

    脈沖計(jì)數(shù)器,作為電子測(cè)量和自動(dòng)化控制領(lǐng)域中一種重要的設(shè)備,其工作原理和基本結(jié)構(gòu)對(duì)于理解其功能和性能至關(guān)重要。脈沖計(jì)數(shù)器主要用于統(tǒng)計(jì)和測(cè)量脈沖信號(hào)的個(gè)數(shù),具有高精度、高速度、高可靠性等特
    的頭像 發(fā)表于 05-15 17:14 ?1868次閱讀

    脈沖計(jì)數(shù)器的分類(lèi)和作用

    在電子技術(shù)和數(shù)字系統(tǒng)中,脈沖計(jì)數(shù)器作為一種基本而重要的邏輯器件,其應(yīng)用廣泛且功能多樣。脈沖計(jì)數(shù)器不僅能夠實(shí)現(xiàn)基本的
    的頭像 發(fā)表于 05-15 17:11 ?811次閱讀

    簡(jiǎn)單認(rèn)識(shí)脈沖計(jì)數(shù)

    在數(shù)字電路和電子測(cè)量領(lǐng)域中,脈沖計(jì)數(shù)器作為一種基本而重要的工具,其應(yīng)用十分廣泛。脈沖計(jì)數(shù)器,也被稱(chēng)為脈沖頻率計(jì)或脈沖數(shù)計(jì),主要用于統(tǒng)計(jì)和測(cè)量輸入脈沖
    的頭像 發(fā)表于 05-15 17:08 ?1459次閱讀

    stm8外部中斷用來(lái)脈沖計(jì)數(shù),外部中斷開(kāi)始計(jì)數(shù),LED燈就不正常了的原因?

    外部中斷用來(lái)脈沖計(jì)數(shù)。不計(jì)數(shù)時(shí),定時(shí)器正常,每秒翻轉(zhuǎn)一次LED燈。外部中斷開(kāi)始計(jì)數(shù),LED燈就不正常了,有時(shí)兩三秒,有時(shí)五六秒才翻轉(zhuǎn)。一開(kāi)始以為是優(yōu)先級(jí),可是配置軟件優(yōu)先級(jí)后還是一樣啊。。。大神們指點(diǎn)一下
    發(fā)表于 04-22 07:29

    電路中如何實(shí)現(xiàn)脈沖計(jì)數(shù)功能和相位檢測(cè)

    在進(jìn)行DA轉(zhuǎn)換,頻率脈沖電壓轉(zhuǎn)換,pwm轉(zhuǎn)變成對(duì)應(yīng)的模擬量,電路是怎么實(shí)現(xiàn)對(duì)固定要求長(zhǎng)度或固定頻率脈沖個(gè)數(shù)進(jìn)行計(jì)數(shù)進(jìn)而轉(zhuǎn)換成模擬量的功能?
    發(fā)表于 01-31 19:55

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時(shí)器脈沖計(jì)數(shù)

    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時(shí)器脈沖計(jì)數(shù)
    的頭像 發(fā)表于 11-09 17:38 ?964次閱讀
    CKS32F4xx系列產(chǎn)品Timer的基本使用方法-定時(shí)器<b class='flag-5'>脈沖計(jì)數(shù)</b>