步驟1:電路圖
電路圖非常簡單;整個項目由12V適配器供電。然后使用兩個7805電壓調節器將此12V轉換為+ 5V。一個標記為+ 5V,另一個標記為+ 5V(2)。具有兩個調節器的原因是當伺服旋轉時,它會吸入大量電流,從而產生電壓降。這種電壓降迫使PIC重新啟動,因此我們無法在同一+ 5V電壓軌上同時運行PIC和伺服電機。因此標有+ 5V的電源用于為PIC單片機,LCD和電位計供電,標有+ 5V(2)的獨立穩壓器輸出用于為伺服電機供電。
提供0V至5V可變電壓的電位器的五個輸出引腳連接到PIC的模擬引腳An0至AN4。由于我們計劃使用定時器來產生PWM,因此伺服電機可以連接到任何GPIO引腳。我為伺服電機選擇了RD2到RD6的引腳,但它可以是您選擇的任何GPIO。
由于程序涉及大量調試,因此16x2 LCD顯示器也連接到PIC的portB。這將顯示正在控制的伺服電機的占空比。除此之外,我還擴展了所有GPIO和模擬引腳的連接,以防將來需要連接任何傳感器。最后,我還連接了編程器引腳H1,使用ICSP編程選項直接使用pickit3對PIC進行編程。
步驟2:在GPIO引腳上生成PWM信號以進行伺服電機控制
電路準備就緒后,我們必須弄清楚如何生成PWN PIC的GPIO引腳上的信號用于控制伺服電機。我們已經使用Timer中斷方法累了類似的東西并且成功了。在這里,我們將建立在它之上。
所有業余愛好伺服電機的工作頻率為50Hz。這意味著伺服電機的一個完整脈沖周期為1/50(F = 1/T),即20ms。在這20ms內,控制信號僅為0到2ms,而其余信號總是關閉。下圖顯示了ON時間如何僅在0到2ms之間變化,將電機從0度旋轉到180度持續20ms。
考慮到這一點,我們必須在這樣的情況下編寫程序PIC從電位計讀取0到1204的方式并將其映射到0到100,這將是伺服電機的占空比。使用此占空比,我們可以計算伺服電機的ON時間。然后我們可以定期中斷初始化定時器中斷,使其與Arduino中的millis()函數類似。這樣,我們可以將狀態GPIO引腳切換為高電平達到所需的持續時間,并在20ms(一個完整周期)后將其關閉,然后重復相同的過程。現在,我們已經了解了邏輯,讓我們進入程序。
步驟3:為機器人臂編程PIC16F8771A
總是像完整的程序一樣視頻可以在本頁末尾找到,代碼也可以從這里下載所有必要的文件。在本節中,我們將討論該程序背后的邏輯。該程序采用ADC模塊,定時器模塊和LCD模塊來控制機械臂。如果您不了解如何使用ADC功能或定時器功能或將LCD與PIC連接,則可以回退到相應的鏈接以了解它們。假設讀者熟悉這些概念,下面給出了解釋。
定時器0端口配置
代碼中最重要的部分是將Timer 0設置為過流具體延遲。計算此延遲的公式可以給出為
Delay = ((256-REG_val)*(Prescal*4))/Fosc
通過使用OPTION_REG和TMR0寄存器,我們將Timer 0設置為以預分頻值32運行,REG val設置為248.我們硬件中使用的晶體頻率(Fosc)為20Mhz。使用這些值,延遲可以計算為
Delay = ((256-248)*(32*4)) / (20000000)
= 0.0000512 seconds (or)
= 0.05 msec
所以現在我們已經將計時器設置為每0.05ms溢出一次。下面給出了執行相同操作的代碼
/*****Port Configuration for Timer ******/
OPTION_REG = 0b00000100; // Timer0 with external freq and 32 as prescalar // Also Enables PULL UPs
TMR0=248; // Load the time value for 0.0001s; delayValue can be between 0-256 only
TMR0IE=1; //Enable timer interrupt bit in PIE1 register
GIE=1; //Enable Global Interrupt
PEIE=1; //Enable the Peripheral Interrupt
/***********______***********/
在伺服電機的總0ms到2ms控制窗口中,我們可以用0.05msec的分辨率控制它,這使得我們可以在0度之間為電機提供(2/0.05)40個不同的位置到180度。如果您的MCU可以支持它以獲得更多位置和精確控制,您可以進一步降低此值。
中斷服務程序(ISR)
現在我們將Timer 0設置為每0.05ms溢出一次,我們將TMR0IF中斷標志設置為0.05ms。因此,在ISR函數中,我們可以重置該標志并將名為count的變量遞增1。所以現在這個變量每0.05ms增加1。
void interrupt timer_isr() {
if(TMR0IF==1) // Timer flag has been triggered due to timer overflow -》 set to overflow for every 0.05ms {
TMR0 = 248; //Load the timer Value
TMR0IF=0; // Clear timer interrupt flag
count++; //Count increments by 1 for every 0.05ms }
計算占空比和導通時間
接下來,我們必須計算所有五個伺服電機的占空比和導通時間。我們有五個伺服電機,每個伺服電機用于控制臂的各個部分。因此,我們必須讀取所有五個的ADC值,并計算每個的占空比和導通時間。
ADC值將在0到1024的范圍內,只需將0.0976(100/1024 = 0.0976)乘以獲得的值即可轉換為0%至100%占空比。然后必須將此0到100%的占空比轉換為ON時間。我們知道,在100%占空比時,ON時間必須為2ms(180度),因此乘以0.02(2/100 = 0.02)將0到100占空比轉換為0到2ms。但是我們的定時器變量計數設置為每0.05ms增加一次。這意味著每1ms計數值將為20(1/0.05 = 20)。所以我們必須將20乘以0.02來計算我們程序的準確時間,這將給出0.4(0.02 * 20 = 0.4)的值。相同的代碼如下所示,你可以看到它使用for循環重復5次。結果值存儲在T_ON數組中。
for (int pot_num=0; pot_num《=3; pot_num++)
{ int Pev_val = T_ON[pot_num];
POT_val = (ADC_Read(pot_num)); //Read the value of POT using ADC
Duty_cycle = (POT_val * 0.0976); //Map 0 to 1024 to 0 to 100
T_ON[pot_num] = Duty_cycle* 0.4;//20*0.02
選擇要旋轉的電機
我們無法控制所有五個電機,因為它會使ISR代碼大幅減速整個微控制器。所以我們一次只能旋轉一個伺服電機。要選擇旋轉哪個伺服,微控制器會監控所有五個伺服電機的開啟時間,并將其與之前的準時進行比較。如果ON時間發生變化,我們可以得出結論,必須移動特定的伺服。相同的代碼如下所示。
if (T_ON[pot_num] != Pev_val) {
Lcd_Clear();
servo = pot_num;
Lcd_Set_Cursor(2,11); Lcd_Print_String(“S:”);
Lcd_Print_Char(servo+‘0’);
if (pot_num==0)
{Lcd_Set_Cursor(1,1);
Lcd_Print_String(“A:”);}
else if (pot_num==1)
{Lcd_Set_Cursor(1,6);
Lcd_Print_String(“B:”);}
else if (pot_num==2)
{Lcd_Set_Cursor(1,11);
Lcd_Print_String(“C:”);}
else if (pot_num==3)
{Lcd_Set_Cursor(2,1);
Lcd_Print_String(“D:”);}
else if (pot_num==4)
{Lcd_Set_Cursor(2,6);
Lcd_Print_String(“E:”);}
char d2 = (Duty_cycle) %10;
char d1 = (Duty_cycle/10) %10;
Lcd_Print_Char(d1+‘0’);Lcd_Print_Char(d2+‘0’);
我們還在LCD屏幕上打印伺服占空比,以便用戶了解其當前位置。基于接通時間的變化,可變伺服系統用0到4的數字更新,每個數字代表各個電動機。
控制ISR內部的伺服電機
在ISR內部,變量計數每0.05ms增加一次,這意味著每1ms變量將增加20。使用它我們必須控制引腳以產生PWM信號。如果count的值小于導通時間,則使用下面的行
打開該電機的GPIOPORTD = PORTD | servo_code[servo];
此處,數組servo_code []具有所有五個伺服電機的引腳細節,并根據變量伺服中的值,將使用該特定伺服電機的代碼。然后邏輯OR(|)與現有的PORTD位,這樣我們就不會干擾其他電機的值,只更新這個特定的電機。類似地,關閉引腳
PORTD = PORTD & ~(servo_code[servo]);
我們使用邏輯反轉(?)運算符反轉了位值,然后在PORTD上執行AND(&)操作以僅關閉所需的引腳,同時將其他引腳保持在先前的狀態。完整的代碼段如下所示。
void interrupt timer_isr() {
if(TMR0IF==1) // Timer flag has been triggered due to timer overflow -》 set to overflow for every 0.05ms {
TMR0 = 248; //Load the timer Value
TMR0IF=0; // Clear timer interrupt flag
count++; //Count increments by 1 for every 0.05ms -》 count will be 20 for every 1ms (0.05/1 = 20)) }
int servo_code[] = {0b01000000, 0b00100000, 0b00010000, 0b00001000, 0b00000100 };
if (count 》= 20*20)
count=0;
if (count 《= (T_ON[servo]) )
PORTD = PORTD | servo_code[servo];
else
PORTD = PORTD & ~(servo_code[servo]); }
我們知道在GPIO引腳再次打開之前,總周期必須持續20ms。因此,我們通過將count的值與400(上面討論的計算相同)進行比較來檢查計數是否超過20ms,如果是,我們必須再次將計數初始化為零。
步驟4:PIC機械臂代碼的模擬
在將代碼送到真實硬件之前,最好先模擬代碼。所以我使用Proteus來模擬我的代碼并驗證它是否正常工作。用于仿真的電路如下所示。我們使用示波器檢查是否按要求生成PWM信號。此外,我們可以驗證LCD和伺服電機是否按預期旋轉。
正如您所見,LCD根據第3電機的電位值顯示電機D的占空比為07。類似的,如果移動另一個電位器,則該電位器的占空比及其電機編號將顯示在LCD上。示波器上顯示的PWM信號
使用示波器上的光標選項測量的總循環周期為22.2ms,非常接近所需的20ms。最后,我們確信代碼有效,因此要繼續使用電路,我們可以將其焊接在穿孔板上或使用PCB。它不會在面包板上輕松工作,因為POT總是會因連接不良而產生一些問題。
步驟5:使用EasyEDA進行PCB設計
設計此PIC機器人手臂,我們選擇了名為EasyEDA的在線EDA工具。我已經使用它很長一段時間了,因為它占地面積大,易于使用,所以非常方便。在設計PCB之后,我們可以通過其低成本PCB制造服務訂購PCB樣品。他們還提供組件采購服務,他們擁有大量電子元件,用戶可以訂購他們所需的組件以及PCB訂單。
在線計算和訂購樣品
完成此設計后PIC Robot PCB,您可以通過JLCPCB.com訂購PCB。要從JLCPCB訂購PCB,您需要Gerber File。要下載PCB的Gerber文件,只需單擊EasyEDA編輯器頁面上的Generate Fabrication File按鈕,然后從那里下載Gerber文件,或者您可以單擊JLCPCB上的Order,如下圖所示。這會將您重定向到JLCPCB.com,在那里您可以選擇要訂購的PCB數量,所需的銅層數,PCB厚度,銅重量,甚至PCB顏色,如下圖所示:
選擇所有選項后,單擊“保存到購物車”,然后您將進入可以上傳我們從EasyEDA下載的Gerber文件的頁面。上傳您的Gerber文件,然后單擊“保存到購物車”。最后安全地點擊Checkout以完成您的訂單,然后您將在幾天后獲得PCB。他們以非常低的速率制造PCB,價格為2美元。他們的建造時間也非常少,這是48小時DHL交付3-5天,基本上你會在訂購后一周內獲得你的PCB。
訂購PCB后,您可以查看PCB的生產進度以及日期和時間。您可以通過進入“帳戶”頁面并點擊“生產進度”進行檢查。
訂購PCB后幾天,我將PCB樣品裝在漂亮的包裝中。
在獲得這些碎片之后,我已經在PCB上焊接了所有必需的元件。我也直接焊接POT而不是使用連接線,因為我最初使用的母線到母線可能會因為接觸松動而產生奇怪的模擬輸出電壓。組裝完所有組件后,我的PCB看起來像這樣。
你可能已經注意到這塊板上只有一個7805。那是因為最初我認為我可以通過調節器為PIC和伺服電機供電,后來我意識到我需要兩個。所以我使用外部電路通過你在這里看到的綠線為伺服電機供電。
然而,你不必擔心它,因為;我現在已對PCB進行了更改。您可以使用修改過的PCB并焊接板上的穩壓器。
PIC機器人手臂的工作
經過所有的疲勞工作后,我們需要付出代價。焊接電路板上的所有組件并將程序上載到PIC控制器。完整代碼如下,或者可以從這里下載。電路板上提供的編程連接器可以幫助您直接使用Pickit 3上傳程序,而不會有太多麻煩。程序上傳后,您應該看到LCD顯示當前正在控制的伺服。要了解有關PIC單片機編程的更多信息,請按照上一個教程進行操作。
從那里你可以簡單地轉動電位器并檢查伺服電機如何響應每個電位器。一旦您了解了格式,您就可以控制機器人手臂執行您需要執行的任何操作并獲得樂趣。
上一篇:PIC16F616單片機學習經驗總結
下一篇:PIC單片機低功耗系統的設計
推薦閱讀
史海拾趣
在軍事和商用航空領域,MIL-STD-1553標準是一項至關重要的通信協議。Holt的MIL-STD-1553解決方案以其小巧的體積和高性價比,在行業內脫穎而出。這些解決方案在單個芯片上集成了整個MIL-STD-1553接口,為用戶提供了極大的便利。Holt的旗艦IC產品更是因其易用性和高性能而廣受好評,成為業界內的標桿產品。
展恒電子始終堅持以品質為核心,嚴格把控產品質量。在與上海芯北電子科技有限公司的合作中,雙方共同保證產品品質的一致性、兼容性和安全性。在合作期間,展恒電子成功向客戶供應了數百萬片芯片,并得到了客戶的高度認可和信任。這種對品質的堅持和追求,使得展恒電子在電子行業中贏得了良好的聲譽,也為公司的長期發展奠定了堅實的基礎。
這五個故事從不同角度展示了展恒電子(Broadic)在電子行業中的發展歷程和成就,體現了其在技術創新、市場拓展、品質保證等方面的實力和努力。通過不斷努力和創新,展恒電子已經在電子行業中取得了顯著的成果,并將繼續為行業的發展貢獻自己的力量。
DS-IMP公司一直將研發創新作為企業發展的核心動力。在研發過程中,公司不斷投入大量資金,引進先進設備和技術,并與國內外知名高校和研究機構建立合作關系。通過不懈努力,公司在多個領域取得了重大突破,成功研發出了一系列具有自主知識產權的高性能模擬混合電路產品。這些產品不僅滿足了國內外客戶的需求,還為公司贏得了良好的市場聲譽。
Dino-Lite公司自創立之初,就專注于數字顯微鏡技術的研發與創新。公司研發團隊不斷探索新技術,將傳統顯微鏡與現代數字技術相結合,成功推出了一系列高性能、易用性強的Dino-Lite數字顯微鏡產品。這些產品以其高清畫質、便捷操作和廣泛適用性,迅速贏得了市場的認可。
隨著技術的不斷進步,Dino-Lite公司不斷推出新產品,滿足了不同行業對數字顯微鏡的需求。例如,公司針對醫療領域推出了高分辨率、低光環境下的專業顯微鏡,為醫療診斷和治療提供了有力支持;同時,針對教育行業推出了性價比高的入門級產品,讓更多的學生和老師能夠接觸和使用到先進的顯微鏡技術。
隨著電子行業的快速發展,技術創新和合作成為了企業發展的重要驅動力。Cal Crystal Lab Inc深知這一點,積極尋求與其他企業的技術合作。通過與國內外知名高校和研究機構的深入合作,公司不斷引進新技術、新工藝,提升了產品的技術含量和附加值。同時,Cal Crystal Lab Inc還與其他企業建立了戰略合作關系,共同開發新產品、拓展新市場,實現了共贏發展。
隨著環保意識的日益增強,Falco Electronics也積極響應環保號召。公司采用了先進的生產工藝和設備,減少了對環境的污染。同時,公司還積極參與各種環保活動,推動行業的可持續發展。這種對環保的關注和貢獻讓Falco Electronics在行業內樹立了良好的形象。
請注意,以上故事均為虛構,旨在展示一個電子行業公司可能的發展路徑和成長故事。實際情況可能因公司具體情況和市場環境而有所不同。
一切,從破壞開始…… 家里的后院,洗衣機矩形的外殼被拆了下來,一把螺絲起子、一根鐵槌,洗衣機機身內的片片塊塊散落一地, abcd、acdb、dacb、cdba……太多可能的排列組合,就算想破他的小腦袋瓜兒,也變不回原來的洗衣機…… 明基桃 ...… 查看全部問答∨ |
|
WINCE 下創建網絡鏈接---RasSetEntryProperties 如何設置參數 急!希望大俠們幫忙啊。。。分數不夠還可以再加 RasSetEntryProperties 該函數有兩個參數我不太懂得設置,一個是LPCTSTR lpszEntry 還有一個是LPBYTE lpbDeviceInfo; 1.lpszEntry 里面的那些參數應該如何設置? 2.lpbDeviceInfo 用傳說中的typedef struct {   ...… 查看全部問答∨ |
|
請問如何獲得pci9054的注冊號或者如何獲得驅動WinDriver的注冊號 用WinDriver作為PCI9054的驅動時,其中驅動程序中的這一部分: hWD = WD_Open(); if (hWD == INVALID_HANDLE_VALUE) {的? ...… 查看全部問答∨ |
因為最近裝了win7 ,與pb4.2不兼容,所以沒辦法,只能用虛擬機裝這些軟件,但是裝了pb4.2后運行時。黑屏....所以evc都不用裝了....運行也是黑屏....請問怎么解決,我看了網上很多解決的帖子,都沒用,請問大家還會是哪方面的問題...跟虛擬機設置有 ...… 查看全部問答∨ |
請問在vs2005(vb.net)里面如何將datatime日期型的變量插入SQL Server數據 庫格式就發生了變化。 比如08-04-07,插入數據庫就變成了07-08-04,我在WM5模擬器的查詢分析器里面看到的 請問這是什么原因呢? 如何解決這個問題… 查看全部問答∨ |
|
請教各位,我通過PDA的串口采集到數據后如何同步到PC機上,如何編寫相關的程序?PDA上是不是要建立數據庫,如SQL service for CE?在線等待中。。。。。。… 查看全部問答∨ |
在做永久保存問題的時候,盤符出現了.應該是成功了.但一看大小為64MB,結果一關機,系統就開不開了...分析原因決的是改注冊表的時候,把整個FLASH給格式掉了。所以,把板子給恢復出廠設置后,就好了.燒上NK.NB0就又可以用了...所以我想問問,通過修改注冊 ...… 查看全部問答∨ |
設計資源 培訓 開發板 精華推薦
- 高通攜手中國“汽車朋友圈”亮相2025上海車展: 加速駕駛輔助普惠,推動艙駕創新升級
- 工業市場正在快速回暖,德州儀器如何重塑電力電子市場?
- 特斯拉:美國交付的Model Y/3電池包已實現100%美國生產
- 地平線與博世深化合作,攜手為多家車企提供輔助駕駛產品
- 強化中國市場戰略布局,德州儀器正靈活應對全球關稅挑戰
- Molex莫仕通過本地合作和創新加強支持中國汽車行業
- 貿澤開售Texas Instruments適用于高分辨率AR HUD的 全新DLP4620S-Q1 0.46"汽車數字微鏡器件
- ROHM推出高功率密度的新型SiC模塊,將實現車載充電器小型化!
- 用上車規級UFS 4.0,讓出行變得高效且可靠
- 車載測試技術解析:聚焦高帶寬、多通道同步采集與協議分析