在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

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

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

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

深入淺出剖析H橋驅(qū)動電路

h1654155149.6853 ? 來源:小麥大叔 ? 作者:菜刀和小麥 ? 2021-10-08 09:59 ? 次閱讀

什么是H橋?H橋是一個比較簡單的電路,通常它會包含四個獨立控制的開關元器件(例如MOS-FET),它們通常用于驅(qū)動電流較大的負載,比如電機,至于為什么要叫H橋(H-Bridge),因為長得比較像字母H,具體如下圖所示;

這里有四個開關元器件Q1,Q2,Q3,Q4,另外還有一個直流電機M,D1,D2,D3,D4是MOS-FET的續(xù)流二極管

開關狀態(tài)下面以控制一個直流電機為例,對H橋的幾種開關狀態(tài)進行簡單的介紹,其中正轉(zhuǎn)和反轉(zhuǎn)是人為規(guī)定的方向,實際工程中按照實際情況進行劃分即可;

正轉(zhuǎn)通常H橋用來驅(qū)動感性負載,這里我們來驅(qū)動一個直流電機;

打開Q1和Q4;

關閉Q2和Q3;

此時假設電機正轉(zhuǎn),這電流依次經(jīng)過Q1,M,Q4,在圖中使用黃色線段進行標注,具體如下圖所示;

正轉(zhuǎn)

反轉(zhuǎn)另外一種狀態(tài)則是電機反轉(zhuǎn);此時四個開關元器件的狀態(tài)如下;

關閉Q1和Q4;

打開Q2和Q3;

此時電機反轉(zhuǎn)(與前面介紹的情況相反),這電流依次經(jīng)過Q2,M,Q3,在圖中使用黃色線段進行標注,具體如下圖所示;

反轉(zhuǎn)

調(diào)速如果要對直流電機調(diào)速,其中的一種方案就是;

關閉Q2,Q3;

打開Q1,Q4上給它輸入50%占空比的PWM波形,這樣就達到了降低轉(zhuǎn)速的效果,如果需要增加轉(zhuǎn)速,則將輸入PWM的占空比設置為100%;

具體如下所示;

停止狀態(tài)這里以電機從正轉(zhuǎn)切換到停止狀態(tài)為例;

正轉(zhuǎn)情況下;Q1和Q4是打開狀態(tài);

這時候如果關閉Q1和Q4,直流電機內(nèi)部可以等效成電感,也就是感性負載,電流不會突變,那么電流將繼續(xù)保持原來的方向進行流動,這時候我們希望電機里的電流可以快速衰減;

這里有兩種辦法:

第一種:關閉Q1和Q4,這時候電流仍然會通過反向續(xù)流二極管進行流動,此時短暫打開Q1和Q3從而達到快速衰減電流的目的;

第二種:準備停止的時候,關閉Q1,打開Q2,這時候電流并不會衰減地很快,電流循環(huán)在Q2,M,Q4之間流動,通過MOS-FET的內(nèi)阻將電能消耗掉;

應用實際使用的時候,用分立元件制作H橋是很麻煩的,市面上已經(jīng)有很多比較常用的IC方案,比如常用的L293D、L298N、TA7257P、SN754410等。接上電源、電機,通過輸入控制信號就可以驅(qū)動電機了;

這個模塊有一個板載5V穩(wěn)壓器,該穩(wěn)壓器可使用跳線的方式進行使能。

如果電機電源電壓高達12V,我們可以啟用5V穩(wěn)壓器,并且5V引腳可以用作輸出,例如給Arduino供電

但是,如果電動機電壓大于12V,則必須斷開跳線,因為這些電壓會損壞板載5V穩(wěn)壓器。

在這種情況下,5V引腳將用作輸入,因為我們需要將其連接到5V電源,以使IC正常工作。

我們在這里可以注意到,該IC的電壓降約為2V。因此,如果使用12V電源,則電動機端子上的電壓約為10V,這意味著我們將無法從12V直流電動機中獲得最大速度。

#defineenA9
#definein16
#definein27
#definebutton4

introtDirection=0;
intpressed=false;

voidsetup(){
pinMode(enA,OUTPUT);
pinMode(in1,OUTPUT);
pinMode(in2,OUTPUT);
pinMode(button,INPUT);
//Setinitialrotationdirection
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
}

voidloop(){
//Readpotentiometervalue
intpotValue=analogRead(A0);
//Mapthepotentiometervaluefrom0to255
intpwmOutput=map(potValue,0,1023,0,255);
//SendPWMsignaltoL298NEnablepin
analogWrite(enA,pwmOutput);

//Readbutton-Debounce
if(digitalRead(button)==true){
pressed=!pressed;
}
while(digitalRead(button)==true);
delay(20);

//Ifbuttonispressed-changerotationdirection
if(pressed==true&rotDirection==0){
digitalWrite(in1,HIGH);
digitalWrite(in2,LOW);
rotDirection=1;
delay(20);
}
//Ifbuttonispressed-changerotationdirection
if(pressed==false&rotDirection==1){
digitalWrite(in1,LOW);
digitalWrite(in2,HIGH);
rotDirection=0;
delay(20);
}
}

簡單描述一下:首先我們需要定義程序所需的引腳和變量。

在setup()中,我們需要設置引腳模式和電機的初始旋轉(zhuǎn)方向。

在loop()中,我們先讀取電位器值,然后將從中獲得的值從0到1023變化,線性映射到PWM信號的0到255的值,將其從0到100%的占空比。

然后使用analogWrite()函數(shù)將PWM信號發(fā)送到L298N板的Enable引腳,該引腳實際上驅(qū)動電動機。

接下來,我們檢查是否按下了按鈕,如果是的話,我們將輸入1和輸入2的狀態(tài)反置,從而改變電動機的旋轉(zhuǎn)方向。該按鈕將用作切換按鈕,每次按下該按鈕都會改變電動機的旋轉(zhuǎn)方向。

總結(jié)本文簡單介紹了H橋的原理,并以直流電機為例簡單介紹了驅(qū)動的狀態(tài),整體比較簡單,適合新手玩家,最后給出了基于Arduino和L298N的驅(qū)動示例,僅供參考。

簡單描述一下:首先我們需要定義程序所需的引腳和變量。

在setup()中,我們需要設置引腳模式和電機的初始旋轉(zhuǎn)方向。

在loop()中,我們先讀取電位器值,然后將從中獲得的值從0到1023變化,線性映射到PWM信號的0到255的值,將其從0到100%的占空比。

然后使用analogWrite()函數(shù)將PWM信號發(fā)送到L298N板的Enable引腳,該引腳實際上驅(qū)動電動機。

接下來,我們檢查是否按下了按鈕,如果是的話,我們將輸入1和輸入2的狀態(tài)反置,從而改變電動機的旋轉(zhuǎn)方向。該按鈕將用作切換按鈕,每次按下該按鈕都會改變電動機的旋轉(zhuǎn)方向。

總結(jié)本文簡單介紹了H橋的原理,并以直流電機為例簡單介紹了驅(qū)動的狀態(tài),整體比較簡單,適合新手玩家,最后給出了基于Arduino和L298N的驅(qū)動示例,僅供參考。

編輯:jq


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

    關注

    172

    文章

    5950

    瀏覽量

    172600
  • 元器件
    +關注

    關注

    112

    文章

    4736

    瀏覽量

    92597
  • 穩(wěn)壓器
    +關注

    關注

    24

    文章

    4254

    瀏覽量

    93978
  • 直流電機
    +關注

    關注

    36

    文章

    1710

    瀏覽量

    70289

原文標題:干貨 | 深入淺出講解H橋驅(qū)動電路

文章出處:【微信號:電子工程世界,微信公眾號:電子工程世界】歡迎添加關注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關推薦

    深居AutoCAD二次開發(fā)

    深居AutoCAD二次開發(fā),net版
    發(fā)表于 01-06 14:12 ?0次下載

    一文掌握基礎電路,嵌入式開發(fā)深入淺出

    1. 電路知識 1.1.?驅(qū)動能力 IC是數(shù)字邏輯芯片,其輸出的是邏輯電平。邏輯電平0表示輸出電壓低于閾值電壓,邏輯1表示輸出電壓高于閾值電壓。負載則是被驅(qū)動電路或元件,負載大小則指
    的頭像 發(fā)表于 12-03 10:36 ?371次閱讀
    一文掌握基礎<b class='flag-5'>電路</b>,嵌入式開發(fā)<b class='flag-5'>深入淺出</b>

    深入淺出RISC-V調(diào)試

    一、JTAG簡介 目前RISC-V官方支持的調(diào)試方式是JTAG(Joint Test Action Group),而ARM支持的調(diào)試方式有JTAG和SWD(Serial Wire Debug)這兩種。 JTAG是一種國際標準的調(diào)試方式(IEEE1149.1),而SWD是ARM開發(fā)的。標準JTAG采用四線方式,分別是TCK、TMS、TDI和TDO,有一個可選的TRST引腳。 ● TCK:測試時鐘輸入。 ● TMS:測試模式選擇。 ● TDI:測試數(shù)據(jù)輸入。 ● TDO:測試數(shù)據(jù)輸出。 在調(diào)試時需要用到一個工具,比如JLink或者CMSIS-DAP,對于這個工具,在這里稱為JTAG主機(JTAG host),而嵌入在芯片內(nèi)部的JTAG稱為JTAG從機(JTAG slave),需要注意的是上面這些信號的輸入輸出方向是對于JTAG從機來說的。下文中如無特別說明,JTAG都是指JTAG從機。 一個JTAG主機可以同時對多個JTAG從機進行調(diào)試,這通過JTAG掃描鏈(JTAG Scan Chain)完成,如圖1所示。 圖1 一個JTAG主機連接多個JTAG從機 JTAG內(nèi)部有一個TAP(Test Access Port)控制器(或者說狀態(tài)機),通過TCK和TMS信號來改變狀態(tài)機的狀態(tài)。這個狀態(tài)機的核心是兩路SCAN,分別是IR SCAN和DR SCAN,TAP狀態(tài)機如圖2所示。 圖2 TAP狀態(tài)機 箭頭上的0或1表示的是TMS信號的電平。JTAG在每一個TCK信號的上升沿采樣TMS信號和TDI信號,決定狀態(tài)機的狀態(tài)是否發(fā)生變化,在每一個TCK信號的下降沿輸出TDO信號。可以看到,無論TAP目前處于哪一個狀態(tài),只要TMS保持高電平并持續(xù)5個TCK時鐘,則TAP一定會回到Test-Logic-Reset狀態(tài)。 JTAG內(nèi)部有一個IR(instruction register)寄存器和多個DR(data register)寄存器,IR寄存器決定要訪問的是哪一個DR寄存器。DR寄存器有IDCODE、BYPASS等。在Test-Logic-Reset狀態(tài)下IR寄存器默認選擇的是IDCODE這個DR寄存器。 JTAG主機通過IR SCAN設置IR寄存器的值,然后通過DR SCAN來讀、寫相應的DR寄存器。 二、RISC-V調(diào)試Spec 調(diào)試模塊在CPU芯片設計里是最為不起眼的,但又是最為復雜的模塊之一,大部分開源的處理器IP都沒有調(diào)試模塊。 下面的內(nèi)容基于RISC-V debug spec 0.13版本。 目前RISC-V的官方調(diào)試上位機是openocd,調(diào)試工具可以是JLink或者CMSIS-DAP,RISC-V調(diào)試系統(tǒng)框架如圖3所示。 圖3 RISC-V調(diào)試系統(tǒng)框架 可以看到主要分為3個部分,分別是Debug Host,可以理解為PC;Debug Hardware,可以理解為JLink或者CMSIS-DAP這樣的調(diào)試工具;第三部分就是嵌入在芯片內(nèi)部的調(diào)試模塊。在調(diào)試模塊內(nèi)部,與調(diào)試工具直接交互的是DTM模塊,DTM模塊通過DMI接口與DM模塊交互。 1>DTM模塊 在DTM模塊里實現(xiàn)了一個TAP控制器(狀態(tài)機),其中IR寄存器的長度最少為5位,當TAP控制器復位時,IR的值默認為5\'b00001,即選擇的是IDCODE寄存器。DTM模塊的寄存器(DR寄存器)定義如圖4所示。 圖4 DTM寄存器 其中紅色框起來的寄存器是必須要實現(xiàn)的。下面簡單介紹一下這幾個寄存器。 ① IDCODE寄存器(0x01) 當TAP狀態(tài)機復位時,IR寄存器的值默認為0x01,即選擇的是IDCODE寄存器。IDCODE寄存器的每一位含義如圖5所示。IDCODE是只讀寄存器。 圖5 IDCODE寄存器 ● Version:只讀,版本號,可為任意值。 ● PartNumber:只讀,可為任意值。 ● Manufld:只讀,廠商號,遵循JEP106標準分配,實際中可為任意值,只要不與已分配的廠商號沖突即可。 ② DTM控制和狀態(tài)寄存器(dtmcs,0x10) dtmcs寄存器的每一位含義如圖6所示。 圖6 dtmcs寄存器 ● dmihardreset:DTM模塊硬復位,寫1有效。 ● dmireset:清除出錯,寫1有效。 ● idle:只讀,JTAG 主機在Run-Test-Idle狀態(tài)停留的時鐘周期數(shù),0表示不需要進入Run-Test-Idle狀態(tài),1表示進入Run-Test-Idle狀態(tài)后可以馬上進入下一個狀態(tài),以此類推。 ● dmistat:只讀,上一次操作的狀態(tài)。0表示無出錯,1或者2表示操作出錯,3表示操作還未完成。 ● abits:只讀,dmi寄存器中address域的大小(位數(shù))。 ● version:只讀,實現(xiàn)所對應的spec版本,0表示0.11版本,1表示0.13版本。 ③ DM模塊接口訪問寄存器(dmi,0x11) dmi寄存器的每一位含義如圖7所示。 圖7 dmi寄存器 ● address:可讀可寫,DM寄存器的長度(位數(shù))。 ● data:可讀可寫,往DM寄存器讀、寫的數(shù)據(jù),固定為32位。 ● op:可讀可寫,讀或者寫這個域時有不同的含義。當寫這個域時,寫0表示忽略address和data的值,相當于nop操作;寫1表示從address指定的寄存器讀數(shù)據(jù);寫2表示把data的數(shù)據(jù)寫到address指定的寄存器。寫3為保留值。當讀這個域時,0表示上一個操作正確完成;1為保留值;2表示上一個操作失敗,這個狀態(tài)是會被記住的,因此需要往dtmcs寄存器的dmireset域?qū)?才能清除這個狀態(tài)。3表示上一個操作還未完成。 在Update-DR狀態(tài)時,DTM開始執(zhí)行op指定的操作。在Capture-DR狀態(tài)時,DTM更新data域。 ④ BYPASS寄存器(0x1f) 只讀,長度為1,值固定為0。 2>DM模塊 從圖3可知,DM模塊訪問RISC-V Core有兩種方式,一種是通過abstract command,另一種是通過system bus。abstract command方式是必須要實現(xiàn)的,system bus的方式是可選的。 DM模塊的寄存器都為32位,定義如圖8所示。 圖8 DM寄存器 下面介紹一下紅色框起來這幾個重要的寄存器。 ① data寄存器(data0-data11,0x04-0x0f) 這12個寄存器是用于abstract command的數(shù)據(jù)寄存器,長度為32位,可讀可寫。 ② DM控制寄存器(dmcontrol,0x10) dmcontrol寄存器的每一位含義如圖9所示。 圖9 dmcontrol寄存器 ● haltreq:只寫,寫1表示halt(暫停)當前hart(hart表示CPU核,存在多核的情況)。 ● resumereq:只能寫1,寫1表示resume(恢復)當前hart,即go。 ● hartreset:可讀可寫,寫1表示復位DM模塊,寫0表示撤銷復位,這是一個可選的位。 ● ackhavereset:只能寫1,寫1表示清除當前hart的havereset狀態(tài)。 ● hasel:可讀可寫,0表示當前只有一個已經(jīng)被選擇了的hart,1表示當前可能有多個已經(jīng)被選擇了的hart。 ● hartsello:可讀可寫,當前選擇的hart的低10位。1位表示一個hart。 ● hartselhi:可讀可寫,當前選擇的hart的高10位。1位表示一個hart。如果只有一個hart,那么hasel的值為0,hartsello的值為1,hartselhi的值為0。 ● setresethaltreq:只能寫1,寫1表示當前選擇的hart復位后處于harted狀態(tài)。 ● clrresethaltreq:只能寫1,寫1表示清除setresethaltreq的值。 ● ndmreset:可讀可寫,寫1表示復位整個系統(tǒng),寫0表示撤銷復位。 ● dmactive:可讀可寫,寫0表示復位DM模塊,寫1表示讓DM模塊正常工作。正常調(diào)試時,此位必須為1。 ③ DM狀態(tài)寄存器(dmstatus,0x11) dmstatus寄存器是一個只讀寄存器,每一位含義如圖10所示。 圖10 dmstatus寄存器 ● impebreak:1表示執(zhí)行完progbuf的指令后自動插入一條ebreak指令,這樣就可以節(jié)省一個progbuf。當progbufsize的值為1時,此值必須為1。 ● allhavereset:1表示當前選擇的hart已經(jīng)復位。 ● anyhavereset:1表示當前選擇的hart至少有一個已經(jīng)復位。 ● allresumeack:1表示當前選擇的所有hart已經(jīng)應答上一次的resume請求。 ● anyresumeack:1表示當前選擇的hart至少有一個已經(jīng)應答上一次的resume請求。 ● allnonexistent:1表示當前選擇的hart不存在于當前平臺。 ● anynonexistent:1表示至少有一個選擇了的hart不存在于當前平臺。 ● allunavail:1表示當前選擇的hart都不可用。 ● anyunavail:1表示至少有一個選擇了的hart不可用。 ● allrunning:1表示當前選擇的hart都處于running狀態(tài)。 ● anyrunning:1表示至少有一個選擇了的hart處于running狀態(tài)。 ● allhalted:1表示當前選擇的hart都處于halted狀態(tài)。 ● anyhalted:1表示至少有一個選擇了的hart處于halted狀態(tài)。 ● authenticated:0表示使用DM模塊之前需要進行認證,1表示已經(jīng)通過認證。 ● authbusy:0表示可以進行正常的認證,1表示認證處于忙狀態(tài)。 ● hasresethaltreq:1表示DM模塊支持復位后處于halted狀態(tài),0表示不支持。 ● confstrptrvalid:1表示confstrptr0~3寄存器保存了配置字符串的地址。 ● version:0表示DM模塊不存在,1表示DM模塊的版本為0.11,2表示DM模塊的版本為0.13。 ④ abstract控制和狀態(tài)寄存器(abstractcs,0x16) abstractcs寄存器定義如圖11所示。 圖11 abstractcs寄存器 ● progbufsize:只讀,program buffer的個數(shù),取值范圍為0~16,每一個的大小為32位。 ● busy:只讀,1表示abstract命令正在執(zhí)行,當寫command寄存器后該位應該馬上被置位直到命令執(zhí)行完成。 ● cmderr:可讀、只能寫1,cmderr的值僅當busy位為0時有效。0表示無錯誤,1表示正在操作command、abstractcs、data或者progbuf寄存器,2表示不支持當前命令,3表示執(zhí)行命令時出現(xiàn)異常,4表示由于當前hart不可用,或者不是處于halted/running狀態(tài)而不能被執(zhí)行,5表示由于總線出錯(對齊、訪問大小、超時)導致的錯誤,7表示其他錯誤。寫1清零cmderr。 ● datacount:只讀,所實現(xiàn)的data寄存器的個數(shù)。 ⑤ abstract命令寄存器(command,0x17) 當寫這個寄存器時,相應的操作就會被執(zhí)行。command寄存器只能寫,定義如圖12所示。 圖12 command寄存器 ● cmdtype:只寫,命令類型,0為表示訪問寄存器,1表示快速訪問,2表示訪問內(nèi)存。 ● control:只寫,不同的命令類型有不同的含義,說明如下。 當cmdtype為0時,control定義如圖13所示。 圖13 訪問寄存器 ● cmdtype:值為0。 ● aarsize:2表示訪問寄存器的最低32位,3表示訪問寄存器的最低64位,4表示訪問寄存器的最低128位。如果大于實際寄存器的大小則此次訪問是失敗的。 ● aarpostincrement:1表示成功訪問寄存器后自動增加regno的值。 ● postexec:1表示執(zhí)行progbuf里的內(nèi)容(指令)。 ● transfer:0表示不執(zhí)行write指定的操作,1表示執(zhí)行write指定的操作。 ● write:0表示從指定的寄存器拷貝數(shù)據(jù)到arg0指定的data寄存器。1表示從arg0指定的data寄存器拷貝數(shù)據(jù)到指定的寄存器。 ● regno:要訪問的寄存器。 綜上,可知: Ⅰ. 當write=0,transfer=1時,從regno指定的寄存器拷貝數(shù)據(jù)到arg0對應的data寄存器。 Ⅱ. 當write=1,transfer=1時,從arg0對應的data寄存器拷貝數(shù)據(jù)到regno指定的寄存器。 Ⅲ. 當aarpostincrement=1時,將regno的值加1。 Ⅳ. 當postexec=1時,執(zhí)行progbuf寄存器里的指令。 arg對應的data寄存器如圖14所示。 圖14 arg對應的data寄存器 即當訪問的寄存器位數(shù)為32位時,arg0對應data0寄存器,arg1對應data1寄存器,arg2對應data2寄存器。 當cmdtype為1時,control定義如圖15所示。 圖15 快速訪問 ● cmdtyte:值為1。 此命令會執(zhí)行以下操作: 1)halt住當前hart。 2)執(zhí)行progbuf寄存器里的指令。 3)resume當前hart。 當cmdtype為2時,control定義如圖16所示。 圖16 訪問內(nèi)存 ● cmdtype:值為2。 ● aamvirtual:0表示訪問的是物理地址,1表示訪問的是虛擬地址。 ● aamsize:0表示訪問內(nèi)存的低8位,1表示訪問內(nèi)存的低16位,2表示訪問內(nèi)存的低32位,3表示訪問內(nèi)存的低64位,4表示訪問內(nèi)存的低128位。 ● aampostincrement:1表示訪問成功后,將arg1對應的data寄存器的值加上aamsize對應的字節(jié)數(shù)。 ● write:0表示從arg1指定的地址拷貝數(shù)據(jù)到arg0指定的data寄存器,1表示從arg0指定的data寄存器拷貝數(shù)據(jù)到arg1指定的地址。 ● target-specific:保留。 綜上,可知: Ⅰ. 當write=0時,從arg1指定的地址拷貝數(shù)據(jù)到arg0指定的data寄存器。 Ⅱ. 當write=1時,從arg0指定的data寄存器拷貝數(shù)據(jù)到arg1指定的地址。 Ⅲ. 當aampostincrement=1時,增加arg1對應的data寄存器的值。 ⑥ 系統(tǒng)總線訪問控制和狀態(tài)寄存器(sbcs,0x38) sbcs寄存器定義如圖17所示。 圖17 sbcs寄存器 ● sbversion:只讀,0表示system bus是2018.1.1之前的版本,1表示當前debug spec的版本,即0.13版本。 ● sbbusyerror:只讀,寫1清零,當debugger要進行system bus訪問操作時,如果上一次的system bus訪問還在進行中,此時會置位該位。 ● sbbusy:只讀,1表示system bus正在忙。在進行system bus訪問前必須確保該位為0。 ● sbreadonaddr:可讀可寫,1表示每次往sbaddress0寄存器寫數(shù)據(jù)時,將會自動觸發(fā)system bus從新的地址讀取數(shù)據(jù)。 ● sbaccess:可讀可寫,訪問的數(shù)據(jù)寬度,0表示8位,1表示16位,2表示32位,3表示64位,4表示128位。 ● sbautoincrement:可讀可寫,1表示每次system bus訪問后自動將sbaddress的值加上sbaccess的大小(字節(jié))。 ● sbreadondata:可讀可寫,1表示每次從sbdata0寄存器讀數(shù)據(jù)后將自動觸發(fā)system bus從新的地址讀取數(shù)據(jù)。 ● sberror:可讀,寫1清零,0表示無錯誤,1表示超時,2表示訪問地址錯誤,3表示地址對齊錯誤,4表示訪問大小錯誤,7表示其他錯誤。 ● sbasize:只讀,system bus地址寬度(位數(shù)),0表示不支持system bus訪問。 ● sbaccess128:只讀,1表示system bus支持128位訪問。 ● sbaccess64:只讀,1表示system bus支持64位訪問。 ● sbaccess32:只讀,1表示system bus支持32位訪問。 ● sbaccess16:只讀,1表示system bus支持16位訪問。 ● sbaccess8:只讀,1表示system bus支持8位訪問。 ⑦ 系統(tǒng)總線地址0寄存器(sbaddress0,0x39) 可讀可寫,如果sbcs寄存器中的sbasize的值為0,那么此寄存器可以不用實現(xiàn)。 當寫該寄存器時,會執(zhí)行以下流程: Ⅰ. 設置sbcs.sbbusy的值為1。 Ⅱ. 從新的sbaddress地址讀取數(shù)據(jù)。 Ⅲ. 如果讀取成功并且sbcs.sbautoincrement的值為1,則增加sbaddress的值。 Ⅳ. 設置sbcs.sbbusy的值為0。 ⑧ 系統(tǒng)總線數(shù)據(jù)0寄存器(sbdata0,0x3c) 可讀可寫,如果sbcs寄存器中的所有sbaccessxx的值都為0,那么此寄存器可以不用實現(xiàn)。 當寫該寄存器時,會執(zhí)行以下流程: Ⅰ. 設置sbcs.sbbusy的值為1。 Ⅱ. 將sbdata的值寫到sbaddress指定的地址。 Ⅲ. 如果寫成功并且sbcs.sbautoincrement的值為1,則增加sbaddress的值。 Ⅳ. 設置sbcs.sbbusy的值為0。 當讀該寄存器時,會執(zhí)行以下流程: Ⅰ. 準備返回讀取的數(shù)據(jù)。 Ⅱ. 設置sbcs.sbbusy的值為1。 Ⅲ. 如果sbcs.sbautoincrement的值為1,則增加sbaddress的值。 Ⅳ. 如果sbcs.sbreadondata的值為1,則開始下一次讀操作。 Ⅴ. 設置sbcs.sbbusy的值為0。 三、RISC-V調(diào)試上位機分析 RISC-V官方支持的調(diào)試器上位機是openocd。openocd是地表最強大(沒有之一)的開源調(diào)試上位機,支持各種target(ARM(M、A系列)、FPGA、RISC-V等),支持各種調(diào)試器(Jlink、CMSIS-DAP、FTDI等),支持JTAG和SWD接口。 這里不打算詳細分析整個openocd的實現(xiàn),只是重點關注針對RISC-V平臺的初始化、讀寫寄存器和讀寫內(nèi)存這幾個流程。 1>openocd啟動過程 openocd啟動時需要通過-f參數(shù)制定一個cfg文件,比如: openocd.exe -f riscv.cfg riscv.cfg文件的內(nèi)容如下: adapter_khz1000 reset_config srst_only adapter_nsrst_assert_width 100 interface cmsis-dap transport select jtag set _CHIPNAME riscv jtag newtap $_CHIPNAME cpu -irlen 5 -expected-id 0x1e200a6d set _TARGETNAME $_CHIPNAME.cpu target create $_TARGETNAME riscv -chain-position $_TARGETNAME ■ 第一行設置TCK的時鐘為1000KHz。 ■ 第二行表示不支持通過TRST引腳復位,只支持TMS為高電平并持續(xù)5個TCK時鐘這種方式的復位。 ■ 第三行是復位持續(xù)的延時。 ■ 第四行指定調(diào)試器為CMSIS-DAP。 ■ 第五行指定調(diào)試接口為JTAG。 ■ 第六行指定調(diào)試的target類型為riscv。 ■ 第七行指定生成一個IR寄存器長度為5位、IDCODE為0x1e200a6d的JTAG TAP。 ■ 第八、九行指定生成一個riscv target。 openocd啟動時的主要流程如圖18所示。 圖18 openocd啟動流程 下面重點關注一下examine target這個流程。 這里的target是指riscv,對于riscv,首先會讀取dtmcontrol這個寄存器,因為openocd支持0.11和0.13版本的DTM,通過這個寄存器可以知道當前調(diào)試的DTM是哪一個版本。這里選擇0.13版本來分析。通過讀取dtmcontrol,還可以知道idle、abits這些參數(shù)。接下來會將dmcontrol這個寄存器的dmactive域?qū)?后再寫1來復位DM模塊。接下來再讀取dmstatus,判斷version域是否為2。接下來還會讀取sbcs和abstractcs寄存器,最后就是初始化每一個hart的寄存器。 2>read register過程 讀寄存器時,先構建command寄存器的內(nèi)容,首先將cmdtype的值設為0,aarsize的值設為2(寄存器的寬度為32位),transfer的值設為1,regno的值設為要讀的寄存器的number,其他值設為0,然后寫到command寄存器里。然后一直讀取abstractcs寄存器,直到abstractcs寄存器的busy位為0或者超時。然后再判斷abstractcs寄存器的cmderr的值是否為0,如果不為0則表示此次讀取寄存器失敗,如果為0則繼續(xù)讀取data0寄存器,這樣就可以得到想要讀的寄存器的值。 3>write register過程 寫寄存器時,先將需要寫的值寫到data0寄存器,然后構建command寄存器的內(nèi)容,首先將cmdtype的值設為0,aarsize的值設為2(寄存器的寬度為32位),transfer的值設為1,write的值設為1,regno的值設為要寫的寄存器的number,其他值設為0,然后寫到command寄存器里。然后一直讀取abstractcs寄存器,直到abstractcs寄存器的busy位為0或者超時。然后再判斷abstractcs寄存器的cmderr的值是否為0,如果不為0則表示此次寫寄存器失敗,如果為0則表示寫寄存器成功。 4>read memory過程 如果progbufsize的值大于等于2,則會優(yōu)先使用通過執(zhí)行指令的方式來讀取內(nèi)存。這里不分析這種方式,而是分析使用system bus的方式。通過前面的分析可知,system bus有兩個版本V0和V1,這里以V1版本來說明。 先將sbcs寄存器的sbreadonaddr的值設為1,sbaccess的值設為2(32位),然后將要讀內(nèi)存的地址寫入sbaddress0寄存器。接著讀sbdata0寄存器,最后讀sbcs寄存器,如果其中的sbbusy、sberror和sbbusyerror都為0,則從sbdata0讀取到的內(nèi)容就是要讀的內(nèi)存的值。 5>write memory過程 和read memory類似,同樣以V1版本來說明。 先將要寫的內(nèi)存地址寫到sbaddress0寄存器,然后將要寫的數(shù)據(jù)寫到data0寄存器,最后讀sbcs寄存器,如果其中的sbbusy、sberror和sbbusyerror都為0,則此次寫內(nèi)存成功。 四、RISC-V JTAG的實現(xiàn) 通過在STM32F103C8T6上實現(xiàn)(模擬)RISC-V調(diào)試標準,進一步加深對RISC-V JTAG調(diào)試的理解。 使用STM32的四個GPIO作為JTAG信號的四根線,其中TCK所在的引腳設為外部中斷,即上升沿和下降沿觸發(fā)方式,實現(xiàn)了可以通過openocd以RISC-V的調(diào)試標準來訪問STM32的寄存器和內(nèi)存。程序流程如圖19所示。 圖19 JTAG實現(xiàn)的程序流程 五、參考資料 1、在STM32上模擬RISC-V JTAG的實現(xiàn):stm32_riscv_jtag_slave 2、一個從零開始寫的易懂的RISC-V處理器核:tinyriscv
    發(fā)表于 11-28 22:00

    h驅(qū)動電路使電機正反轉(zhuǎn)原理

    H驅(qū)動電路使電機正反轉(zhuǎn)的原理是一個在電子和電機控制領域廣泛應用的基礎知識。 一、H
    的頭像 發(fā)表于 10-06 14:53 ?1989次閱讀
    <b class='flag-5'>h</b><b class='flag-5'>橋</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>電路</b>使電機正反轉(zhuǎn)原理

    深入淺出系列之代碼可讀性

    原創(chuàng)聲明:該文章是個人在項目中親歷后的經(jīng)驗總結(jié)和分享,如有搬運需求請注明出處。 這是“深入淺出系列”文章的第一篇,主要記錄和分享程序設計的一些思想和方法論,如果讀者覺得所有受用,還請“一鍵三連
    的頭像 發(fā)表于 08-09 16:00 ?279次閱讀

    H電機驅(qū)動電路電路H電機驅(qū)動電路的工作原理和控制方式

    H電機驅(qū)動電路是一種廣泛應用于電機控制領域的電子電路,其名稱來源于其形狀類似于英文字母“H”的
    的頭像 發(fā)表于 06-21 16:34 ?9478次閱讀
    <b class='flag-5'>H</b><b class='flag-5'>橋</b>電機<b class='flag-5'>驅(qū)動</b><b class='flag-5'>電路</b><b class='flag-5'>電路</b>圖 <b class='flag-5'>H</b><b class='flag-5'>橋</b>電機<b class='flag-5'>驅(qū)動</b><b class='flag-5'>電路</b>的工作原理和控制方式

    為什么H逆變的驅(qū)動電路要用隔離電源?

    H逆變器是一種用于直流到交流轉(zhuǎn)換的電力電子設備,廣泛應用于電機驅(qū)動、電源轉(zhuǎn)換、能量存儲系統(tǒng)等領域。
    的頭像 發(fā)表于 05-12 17:12 ?1950次閱讀

    請問H電路和半電路一樣嗎?

    H電路和半電路是兩種不同的電力電子電路,它們在結(jié)構、工作原理和應用方面都有所區(qū)別。
    的頭像 發(fā)表于 05-11 16:59 ?2944次閱讀

    H驅(qū)動電路用什么芯片

    H驅(qū)動電路是一種用于控制電機方向和速度的電路,它允許電流在兩個方向上流動,從而實現(xiàn)對電機的正反轉(zhuǎn)控制。
    的頭像 發(fā)表于 05-11 16:52 ?2790次閱讀

    深入淺出帶你搞懂-MOSFET柵極電阻

    一、MOSFET簡介MOSFET是金屬(metal)—氧化物(oxide)—半導體(semiconductor)場效應晶體管,屬于電壓控制電流型元件,是開關電路中的基本元件,其柵極(G極)內(nèi)阻極高
    的頭像 發(fā)表于 05-09 08:10 ?2.3w次閱讀
    <b class='flag-5'>深入淺出</b>帶你搞懂-MOSFET柵極電阻

    H電路是如何工作的?H電路有何作用?

    將兩個MOS管一上一下的方式放在一條直線上,叫做“半”,我們分別叫它上管和下管,而兩個半組合一起,就是H電路,正中心就是負載電機。
    的頭像 發(fā)表于 04-29 18:21 ?2242次閱讀
    <b class='flag-5'>H</b><b class='flag-5'>橋</b><b class='flag-5'>電路</b>是如何工作的?<b class='flag-5'>H</b><b class='flag-5'>橋</b><b class='flag-5'>電路</b>有何作用?

    H驅(qū)動電路工作原理圖

    H驅(qū)動電路在控制、能耗、功能以及適用性等方面都具有顯著的優(yōu)勢,使其在電機驅(qū)動、控制系統(tǒng)等領域得到廣泛應用。
    的頭像 發(fā)表于 03-13 17:38 ?2118次閱讀
    <b class='flag-5'>H</b><b class='flag-5'>橋</b><b class='flag-5'>驅(qū)動</b><b class='flag-5'>電路</b>工作原理圖

    H驅(qū)動直流電機電路原理介紹

    H電路是一種廣泛應用于直流電機驅(qū)動的電子電路,其名稱源于電路結(jié)構形似字母“
    的頭像 發(fā)表于 02-16 09:59 ?2519次閱讀
    <b class='flag-5'>H</b><b class='flag-5'>橋</b><b class='flag-5'>驅(qū)動</b>直流電機<b class='flag-5'>電路</b>原理介紹

    直流電機h驅(qū)動方式有哪些

    在現(xiàn)代工業(yè)控制系統(tǒng)中,直流電機因其出色的速度和位置控制性能而得到廣泛應用。其中,H電路作為一種常見的電機驅(qū)動方案,能夠?qū)崿F(xiàn)電機的正反轉(zhuǎn)及速度調(diào)節(jié)。今天,我們就來
    的頭像 發(fā)表于 02-16 09:41 ?1140次閱讀
    直流電機<b class='flag-5'>h</b><b class='flag-5'>橋</b><b class='flag-5'>驅(qū)動</b>方式有哪些

    H電機驅(qū)動器路圖分享

    H電機驅(qū)動器是一種電子電路,用于控制直流電機的前進、后退、停止和調(diào)速等動作。H電機
    的頭像 發(fā)表于 02-04 16:24 ?2580次閱讀
    <b class='flag-5'>H</b><b class='flag-5'>橋</b>電機<b class='flag-5'>驅(qū)動</b>器路圖分享
    主站蜘蛛池模板: www.五月激情| 亚洲人成电影综合网站色| 新激情五月| 爆操欧美| 欧美老汉色| 18岁女人毛片| 黄色在线免费看| 日韩一级生活片| 一级做a爱片就在线看| caoporn成人免费公开| 精品久久天干天天天按摩| www.色.con| 精品国产你懂的在线观看| 韩国在线视频| 久久久久久久久久久9精品视频| 色综合久久久久久久久五月 | 欧美第一色| 色综久久| 免费一级欧美在线观看视频片| 日本三级视频在线播放| 天堂最新版| 亚洲成人在线网| 99亚洲精品卡2卡三卡4卡2卡| 亚洲一区中文字幕在线观看| 夜性影院| 成人一级网站| 亚洲一区二区三区高清| 正在播放91大神调教偷偷| 99久久99久久久精品齐齐鬼色| 亚洲人成人网毛片在线播放| 日本偷偷操| 成人久久精品| bt天堂网在线资源www| 日本午夜影院| 国产―笫一页―浮力影院xyz| 久久天天躁狠狠躁夜夜爽| 免费簧片视频| 国产免费午夜| 1000部禁片黄的免费看| 丁香婷婷啪啪| 亚洲九色|