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

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

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

制作一個0-20mA的的信號發(fā)生器,可以給很多儀器儀表做校準或測試

lPCU_elecfans ? 來源:未知 ? 作者:李倩 ? 2018-07-03 16:01 ? 次閱讀

概述

一般儀器儀表信號電流都為4-20mA,指最小電流為4mA,最大電流為20mA。傳輸信號時候,要考慮到導(dǎo)線上也有電阻,如果用電壓傳輸則會在導(dǎo)線的產(chǎn)生一定的壓降,那接收端的信號就會產(chǎn)生一定的誤差,所以使用電流信號作為變送器的標準傳輸。為什么選擇4-20mA而不是0-20mA呢?4ma而不是0ma是用來檢測線路開路的,如果0是最小,那么開路故障就檢測不到了。為了解決上述問題和避開相關(guān)噪聲的影響,我們用電流來傳輸信號,因為電流對噪聲并不敏感。4~20mA的電流環(huán)便是用4mA表示零信號,用20mA表示信號的滿刻度,而低于4mA高于20mA的信號用于各種故障的報警。

很多控制器接受來自各種檢測儀表的0~20mA或4~20mA電流,制作一個0-20mA的的信號發(fā)生器,可以給很多儀器儀表做校準或測試。

2. 總體方案設(shè)計

2.1. 設(shè)計目標

單片機控制4路PWM,輸出的PWM信號控制輸出電壓在0-3.0V之間,經(jīng)過電流電壓轉(zhuǎn)電流電路變成電流信號,輸出電流在0-20mA之間。按鍵調(diào)節(jié)輸出電流,oled實時顯示4路電流值。

2.2. 設(shè)計思路

芯片選擇STM32F030C8T6,帶4路PWM輸出,性價比高,同時支持rt-thread操作系統(tǒng),這里我們選用2.1的版本。OLED選用中景園電子0-96寸OLED。

2.2.1.硬件電路原理

圖1是一個電壓轉(zhuǎn)電流的典型電路。單片機輸出PWM,控制Vi電壓電平在0-3V之間,RL流過的電流為0-20ma。

圖1 電壓轉(zhuǎn)電流電路

圖2 OLED顯示電路

由于MCU內(nèi)部可配置上拉電阻,所以可以直接將按鍵接到MCU上。

圖3 按鍵電路

2.2.2.軟件設(shè)計流圖

2.2.3.關(guān)鍵代碼

按鍵部分代碼。

/* key thread entry */

staticvoid key_thread_entry(void*parameter)

{

KEY_e i;

uint8_t key_state1[KEY_NUM];

uint8_t key_state2[KEY_NUM];

uint8_t key_counter[KEY_NUM];

rt_base_t level;

memset(key_counter, 0, sizeof(key_counter));

while(1)

{

for (i=KEY1; i

{

key_state1[i] = rt_hw_key(i);

}

rt_thread_delay(RT_TICK_PER_SECOND / 20);

for (i=KEY1; i

{

key_state2[i] = rt_hw_key(i);

}

for (i=KEY1; i

{

if (key_state1[i] == key_state2[i] &&

key_state1[i] == 0)

{

level =rt_hw_interrupt_disable();

if (key_counter[i] == 0)

{

switch(i)

{

case KEY2:

if (pwm_channel< 3)

{

pwm_channel++;

}

break;

case KEY1:

if (pwm_channel> 0)

pwm_channel--;

break;

case KEY3:

if(pwm_value[pwm_channel] < 20000)

pwm_value[pwm_channel]++;

break;

case KEY4:

if(pwm_value[pwm_channel] > 0)

pwm_value[pwm_channel]--;

break;

case KEY5:

if(pwm_value[pwm_channel] < 16000)

pwm_value[pwm_channel] += 4000;

else

pwm_value[pwm_channel] = 20000;

break;

case KEY6:

if(pwm_value[pwm_channel] >= 4000)

pwm_value[pwm_channel] -= 4000;

else

pwm_value[pwm_channel] = 0;

break;

}

rt_kprintf("key %dclicked ", i);

}

if (key_counter[i] >= 5)

{

switch(i)

{

case KEY2:

if (pwm_channel< 3)

{

pwm_channel++;

}

break;

case KEY1:

if (pwm_channel> 0)

pwm_channel--;

break;

case KEY3:

if(pwm_value[pwm_channel] < 20000)

pwm_value[pwm_channel]++;

break;

case KEY4:

if(pwm_value[pwm_channel] > 0)

pwm_value[pwm_channel]--;

break;

case KEY5:

if(pwm_value[pwm_channel] < 16000)

pwm_value[pwm_channel]+= 4000;

else

pwm_value[pwm_channel] = 20000;

break;

case KEY6:

if(pwm_value[pwm_channel] >= 4000)

pwm_value[pwm_channel] -= 4000;

else

pwm_value[pwm_channel] = 0;

break;

}

rt_kprintf("key%d pressed ", i);

}

if (key_counter[i] < 5)

{

key_counter[i]++;

}

rt_hw_interrupt_enable(level);

}

else

{

key_counter[i] = 0;

}

}

rt_thread_delay(RT_TICK_PER_SECOND / 100);

}

}

oled顯示部分代碼。

/* oled thread entry */

staticvoid oled_thread_entry(void*parameter)

{

uint8_t i;

rt_base_tlevel;

char str_pwm[64];

OLED_Init();

OLED_Clear();

PWM_TIM1(999, 1); //48MHZ/(999+1)/(1+1) = 24KHZ

while(1)

{

//OLED_ShowString(0, 3,"1.3' OLED TEST");

if ((memcmp(pwm_value_temp, pwm_value, sizeof(pwm_value)) != 0) ||

(pwm_channel_temp != pwm_channel))

{

level = rt_hw_interrupt_disable();

memcpy((char *)pwm_value_temp, (char *)pwm_value, sizeof(pwm_value));

pwm_channel_temp = pwm_channel;

rt_hw_interrupt_enable(level);

for (i=0; i<4; i++)

{

if (pwm_channel == i)

{

snprintf(str_pwm, 64,"* %2d.%03d ma", pwm_value[i]/1000, pwm_value[i]%1000);

}

else

{

snprintf(str_pwm, 64," %2d.%03d ma",pwm_value[i]/1000, pwm_value[i]%1000);

}

OLED_ShowString(0, i*2,(uint8_t *)str_pwm);

}

TIM_SetCompare1(TIM1, 0.915 *(pwm_value_temp[3] * 999) / 20000);

TIM_SetCompare2(TIM1, 0.915 *(pwm_value_temp[2] * 999) / 20000);

TIM_SetCompare3(TIM1, 0.915 *(pwm_value_temp[1] * 999) / 20000);

TIM_SetCompare4(TIM1, 0.915 *(pwm_value_temp[0] * 999) / 20000);

rt_thread_delay(RT_TICK_PER_SECOND / 10);

}

else

{

//OLED_ShowString(63,6,"CODE:");

rt_thread_delay(RT_TICK_PER_SECOND / 10);

}

}

}

2.2.4.RTT使用情況

按鍵的初始化函數(shù)可以不用再main函數(shù)中添加,而是在key.c中調(diào)用下面的函數(shù)就可以了INITDEVICEEXPORT(rthwkey_init),代碼看起來干凈整潔。通過scons來裁剪配置系統(tǒng),不需要人為刪減代碼,非常好用。Finsh組件,方便調(diào)試,方便自定義添加串口命令。代碼類linux編程風(fēng)格。提供POSIX 標準接口,上層代碼移植方便。

3. 實物展示

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

    關(guān)注

    40

    文章

    6502

    瀏覽量

    131113
  • 控制器
    +關(guān)注

    關(guān)注

    112

    文章

    15886

    瀏覽量

    175386
  • 發(fā)生器
    +關(guān)注

    關(guān)注

    4

    文章

    1351

    瀏覽量

    61454

原文標題:【周四RTOS專欄】一招教你設(shè)計RT-Thread的0-20mA電流發(fā)生器

文章出處:【微信號:elecfans,微信公眾號:電子發(fā)燒友網(wǎng)】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    回收SMC100A信號發(fā)生器//二手儀器儀表回收

    回收羅德與施瓦茨SMC100A ,大量回收SMC100A信號發(fā)生器東莞市諾展電子儀器有限公司本公司專業(yè)回收電子測量/通信測試儀器儀表,需要處理儀器儀
    發(fā)表于 11-06 10:31

    全新供應(yīng)Fluke 707普通回路校準器 4-20毫安信號發(fā)生器 東莞市德佳儀器

    `全新供應(yīng)Fluke 707普通回路校準器 4-20毫安信號發(fā)生器我司長期經(jīng)營誠信儀表銷售、租賃等業(yè)務(wù),二手
    發(fā)表于 12-21 10:29

    20Hz信號發(fā)生器電路及制作

    20Hz信號發(fā)生器電路及制作
    發(fā)表于 04-13 16:14 ?455次下載
    <b class='flag-5'>20</b>Hz<b class='flag-5'>信號</b><b class='flag-5'>發(fā)生器</b>電路及<b class='flag-5'>制作</b>

    圖像信號發(fā)生器_福祿克PM54200系列儀器儀表設(shè)備全新低價

    低價供應(yīng)全新圖像信號發(fā)生器_福祿克PM54200系列儀器儀表設(shè)備:
    發(fā)表于 10-05 12:52 ?907次閱讀

    4-20ma信號發(fā)生器電路(可自已制作)

    4-20ma信號發(fā)生器電路 制作要求:以精度0.5級為例,二線制4~20mA模擬恒環(huán)路信號
    發(fā)表于 05-12 09:55 ?2.2w次閱讀
    4-<b class='flag-5'>20ma</b><b class='flag-5'>信號</b><b class='flag-5'>發(fā)生器</b>電路(可自已<b class='flag-5'>制作</b>)

    基于RT-Thread的0-20mA電流發(fā)生器方案設(shè)計

    儀器儀表信號電流都為4-20mA,指最小電流為4mA,最大電流為20mA。傳輸
    的頭像 發(fā)表于 07-28 11:34 ?6195次閱讀
    基于RT-Thread的<b class='flag-5'>0-20mA</b>電流<b class='flag-5'>發(fā)生器</b>方案設(shè)計

    PWM轉(zhuǎn)0-20mA/4-20mA電流輸出模塊:GP8102-2

    GP8102-2(7腳外掛運放)為PWM轉(zhuǎn)0-20mA/4-20mA電流模塊,可以將占空比為0
    的頭像 發(fā)表于 12-03 15:44 ?1.3w次閱讀
    PWM轉(zhuǎn)<b class='flag-5'>0-20mA</b>/4-<b class='flag-5'>20mA</b>電流輸出模塊:GP8102-2

    ISO的4-20mA電流環(huán)路信號隔離

    4-20mA(0-20mA)電流信號輸出的無源信號隔離模塊。方案采用獨有的電磁隔離模式及高效能輸入端回路竊電技術(shù),有效地解決了儀器儀表與傳
    發(fā)表于 04-20 15:47 ?7次下載

    儀器儀表的標定、檢定、校準、校驗的區(qū)別

    很多人對于儀器儀表的標定、檢定、校準、校驗還不是很清楚,下面安泰維修專業(yè)從事儀器儀表維修工程師帶大家了解下關(guān)于
    的頭像 發(fā)表于 11-14 14:49 ?7835次閱讀

    矢量信號發(fā)生器校準流程

    發(fā)生器進行校準。 、矢量信號發(fā)生器儀器校準步驟 ?
    的頭像 發(fā)表于 02-10 13:14 ?1797次閱讀
    矢量<b class='flag-5'>信號</b><b class='flag-5'>發(fā)生器</b><b class='flag-5'>校準</b>流程

    0-20mA轉(zhuǎn)0-500Hz/1-5KHz/PLC頻率計采集轉(zhuǎn)換

    貝??萍佳邪l(fā)的電壓電流信號轉(zhuǎn)頻率信號隔離變送器產(chǎn)品主要用于0-5V/0-10V/1-5V, 0-10m
    的頭像 發(fā)表于 05-10 18:18 ?929次閱讀
    <b class='flag-5'>0-20mA</b>轉(zhuǎn)<b class='flag-5'>0</b>-500Hz/1-5KHz/PLC頻率計采集轉(zhuǎn)換

    無源型低成本、小體積兩線制4-20mA0-20mA)電流環(huán)路模擬 信號隔離

    兩線無源ISO 4-20mA(SIP12 Pin封裝)和ISOS 4-20mA(SIP7 Pin封裝)的4-20mA電流環(huán)路信號隔離,是
    的頭像 發(fā)表于 12-06 10:01 ?1630次閱讀
    無源型低成本、小體積兩線制4-<b class='flag-5'>20mA</b>(<b class='flag-5'>0-20mA</b>)電流環(huán)路模擬 <b class='flag-5'>信號</b>隔離<b class='flag-5'>器</b>

    如何實現(xiàn)信號發(fā)生器制作呢?

    今天大家分享信號發(fā)生器制作方法,這個小制作
    的頭像 發(fā)表于 11-15 15:33 ?1673次閱讀
    如何實現(xiàn)<b class='flag-5'>一</b><b class='flag-5'>個</b><b class='flag-5'>信號</b><b class='flag-5'>發(fā)生器</b>的<b class='flag-5'>制作</b>呢?

    4—20ma信號發(fā)生器的注意事項

    4-20mA信號發(fā)生器種用于測量和控制工業(yè)過程的儀器,它可以將傳感
    的頭像 發(fā)表于 08-30 09:30 ?209次閱讀

    420ma信號發(fā)生器拿什么能代替

    在工業(yè)自動化領(lǐng)域,4-20mA信號發(fā)生器種常見的設(shè)備,用于模擬傳感信號,以便于對控制系統(tǒng)進
    的頭像 發(fā)表于 08-30 09:32 ?155次閱讀