国产精品久久久久久亚洲影视,插我舔内射18免费视频,国产+精品+在线观看,国产精品18久久久久久麻辣,丰满少妇69激情啪啪无

0 賣盤信息
BOM詢價
您現(xiàn)在的位置: 首頁 > 技術(shù)方案 >工業(yè)控制 > 基于51單片機(jī)的PID電機(jī)驅(qū)動設(shè)計(含驅(qū)動程序+接線圖)

基于51單片機(jī)的PID電機(jī)驅(qū)動設(shè)計(含驅(qū)動程序+接線圖)

來源: 電路城
2021-11-16
類別:工業(yè)控制
eye 89
文章創(chuàng)建人 拍明

原標(biāo)題:基于51單片機(jī)的PID電機(jī)驅(qū)動設(shè)計(含驅(qū)動程序+接線圖)

基于51單片機(jī)的PID直流電機(jī)驅(qū)動設(shè)計與實現(xiàn)

在現(xiàn)代自動化控制領(lǐng)域,直流電機(jī)因其結(jié)構(gòu)簡單、控制方便、響應(yīng)速度快等優(yōu)點(diǎn),被廣泛應(yīng)用于各類機(jī)器人、智能小車、自動化生產(chǎn)線以及精密儀器中。然而,要實現(xiàn)對直流電機(jī)精確、平滑的調(diào)速和位置控制,僅依靠簡單的開環(huán)控制是遠(yuǎn)遠(yuǎn)不夠的。閉環(huán)控制是解決這一問題的核心,其中,PID(比例-積分-微分)控制算法以其卓越的性能和普適性,成為了最常用且最有效的控制策略之一。本篇文章將深入探討如何基于經(jīng)典的51系列單片機(jī),設(shè)計并實現(xiàn)一套完整的PID直流電機(jī)驅(qū)動系統(tǒng)。我們將從系統(tǒng)架構(gòu)、元器件選型、硬件電路設(shè)計到軟件編程實現(xiàn),進(jìn)行全面而詳盡的闡述,并對每個環(huán)節(jié)的細(xì)節(jié)進(jìn)行深入分析。

image.png

1. 系統(tǒng)架構(gòu)與工作原理

本設(shè)計采用的PID電機(jī)驅(qū)動系統(tǒng)為一個典型的閉環(huán)控制系統(tǒng)。其核心思想是,通過編碼器實時獲取電機(jī)的轉(zhuǎn)速或位置信息,將其作為系統(tǒng)的反饋值。這個反饋值會與我們設(shè)定的目標(biāo)值(例如期望的轉(zhuǎn)速或位置)進(jìn)行比較,得到偏差。然后,PID控制器根據(jù)這個偏差,計算出新的控制量,通過電機(jī)驅(qū)動芯片去改變加在電機(jī)兩端的電壓或PWM占空比,從而調(diào)整電機(jī)的實際運(yùn)行狀態(tài),使其不斷逼近目標(biāo)值。

整個系統(tǒng)的核心組件包括:

  • 中央處理器(CPU):這里我們選擇AT89C51/STC89C52系列單片機(jī)作為主控芯片。它負(fù)責(zé)接收目標(biāo)值、讀取編碼器反饋、執(zhí)行PID算法、并輸出PWM信號。

  • 電機(jī)驅(qū)動模塊:負(fù)責(zé)放大單片機(jī)輸出的弱PWM信號,提供足夠的電流和電壓來驅(qū)動直流電機(jī)。我們選用L298N電機(jī)驅(qū)動模塊,它集成度高,能夠方便地控制電機(jī)的正反轉(zhuǎn)和速度。

  • 速度/位置傳感器:采用增量式光電編碼器。它安裝在電機(jī)尾部,隨電機(jī)轉(zhuǎn)動,輸出方波脈沖信號。通過計算單位時間內(nèi)的脈沖數(shù),可以精確地得到電機(jī)的轉(zhuǎn)速;通過累加脈沖數(shù),則可以得到電機(jī)轉(zhuǎn)動的角度或位置。

  • 直流電機(jī):本設(shè)計采用額定電壓12V的直流減速電機(jī),帶有編碼器,適用于智能小車或小型機(jī)械臂等應(yīng)用。

  • 電源模塊:提供系統(tǒng)工作所需的穩(wěn)定電源。一般需要兩路電源,一路是5V穩(wěn)壓電源為單片機(jī)和編碼器供電,另一路是12V電源為電機(jī)供電。

2. 核心元器件選型與分析

選擇合適的元器件是設(shè)計成功的基礎(chǔ),我們對每一個核心元器件的選擇都進(jìn)行了深入的考量。

2.1 主控芯片:STC89C52RC單片機(jī)

我們之所以選擇STC89C52RC作為主控芯片,而非其他更高級的單片機(jī),是基于以下幾點(diǎn)考慮:

  • 經(jīng)典的51架構(gòu):51單片機(jī)架構(gòu)成熟穩(wěn)定,資料豐富,開發(fā)環(huán)境簡單,對于初學(xué)者友好。其強(qiáng)大的定時器/計數(shù)器資源非常適合處理編碼器的脈沖計數(shù)和PWM信號的生成。

  • 功能強(qiáng)大:STC89C52RC是STC公司對傳統(tǒng)51單片機(jī)的增強(qiáng)版,它內(nèi)置了8K字節(jié)的Flash程序存儲器,512字節(jié)的RAM,并且擁有3個16位定時器/計數(shù)器(T0、T1、T2),這為PID算法的實現(xiàn)提供了足夠的計算空間和定時資源。特別是T2定時器,它能夠配置為自動重裝載模式,非常適合用來產(chǎn)生精準(zhǔn)的PWM波形,或者用于對編碼器脈沖進(jìn)行高頻計數(shù)。

  • 集成度高:它內(nèi)置了**ISP(在系統(tǒng)編程)**功能,通過串口即可下載程序,無需額外的編程器,極大地簡化了開發(fā)流程。

  • 性價比高:STC89C52RC的價格低廉,能夠滿足大部分實驗和小型項目的需求,同時保持了系統(tǒng)的低成本。

2.2 電機(jī)驅(qū)動芯片:L298N

L298N是一款經(jīng)典的雙路全橋驅(qū)動芯片,它能夠驅(qū)動兩個直流電機(jī),或者一個兩相步進(jìn)電機(jī)。我們選擇它的理由是:

  • 大電流驅(qū)動能力:L298N的最大驅(qū)動電流可達(dá)2A,峰值電流可達(dá)3A,能夠輕松驅(qū)動我們選用的直流減速電機(jī),避免因電流不足導(dǎo)致電機(jī)轉(zhuǎn)速不穩(wěn)或無法啟動。

  • 雙路驅(qū)動:L298N芯片內(nèi)置了兩個獨(dú)立的H橋,可以同時驅(qū)動兩個電機(jī)。如果我們的項目是四輪小車,只需要兩個L298N芯片即可實現(xiàn)對四個電機(jī)的控制,具有很好的擴(kuò)展性。

  • 控制簡單:L298N提供了IN1、IN2、IN3、IN4四個邏輯控制輸入端,以及EN A、EN B兩個使能端。通過對IN1和IN2的電平組合,可以輕松控制電機(jī)A的正轉(zhuǎn)、反轉(zhuǎn)和停止。而通過對EN A端輸入**PWM(脈沖寬度調(diào)制)**信號,就可以實現(xiàn)對電機(jī)速度的無級調(diào)速,這正是PID控制所需要的核心功能。

  • 可靠性高:L298N內(nèi)部集成了過熱保護(hù)功能,當(dāng)芯片溫度過高時會自動關(guān)斷輸出,保護(hù)電機(jī)和芯片本身不受損壞。

2.3 速度傳感器:光電編碼器

編碼器是閉環(huán)控制系統(tǒng)的“眼睛”,其精度直接決定了控制系統(tǒng)的性能。我們選用增量式光電編碼器,其工作原理是:編碼器內(nèi)部有一個帶有等間隔狹縫的碼盤,碼盤隨電機(jī)轉(zhuǎn)動,通過光電對管對光線進(jìn)行遮擋和透射,從而產(chǎn)生一系列方波脈沖。

  • A/B相輸出:增量式編碼器通常會輸出兩路相位相差90度的方波信號,即A相和B相。通過比較A相和B相的相位超前關(guān)系,我們不僅可以判斷出電機(jī)的轉(zhuǎn)速,還可以準(zhǔn)確地判斷出電機(jī)的轉(zhuǎn)動方向。這對于需要正反轉(zhuǎn)控制的PID系統(tǒng)至關(guān)重要。

  • 高精度:編碼器的脈沖數(shù)決定了其分辨率。例如,一個360線的編碼器,其A相和B相信號在經(jīng)過四倍頻處理后(在一個周期內(nèi),上升沿、下降沿、A相和B相的組合變化可以看作4個脈沖),每轉(zhuǎn)一圈可以產(chǎn)生1440個脈沖,為精確的速度和位置控制提供了足夠的分辨率。

2.4 其他輔助元器件

  • 穩(wěn)壓芯片7805穩(wěn)壓芯片用于將12V電源降壓至5V,為單片機(jī)和編碼器供電,確保其在穩(wěn)定電壓下工作。

  • 電容濾波電容(100uF或更大)用于平滑電源電壓,去耦電容(0.1uF)用于濾除高頻噪聲,保證電路的穩(wěn)定性。

  • 晶振:12MHz或11.0592MHz的晶體振蕩器,為單片機(jī)提供穩(wěn)定的時鐘源。選擇11.0592MHz是因為它可以精確地產(chǎn)生標(biāo)準(zhǔn)的波特率,方便串口通信進(jìn)行調(diào)試。

3. 硬件電路設(shè)計與接線圖

硬件電路是實現(xiàn)整個系統(tǒng)的物理基礎(chǔ)。合理的電路設(shè)計和接線是系統(tǒng)穩(wěn)定運(yùn)行的保障。

3.1 電路設(shè)計思路

整個硬件電路分為三個主要部分:單片機(jī)最小系統(tǒng)、電機(jī)驅(qū)動電路和編碼器信號處理電路。

  • 單片機(jī)最小系統(tǒng):包括單片機(jī)STC89C52、復(fù)位電路、晶振電路和電源電路。復(fù)位電路由一個10k電阻和10uF電容組成,實現(xiàn)上電自動復(fù)位。晶振電路由一個12MHz晶振和兩個22pF電容組成。

  • 電機(jī)驅(qū)動電路:主要由L298N芯片構(gòu)成。L298N的IN1、IN2端連接到單片機(jī)的IO口,用于控制電機(jī)的正反轉(zhuǎn)。EN A端連接到單片機(jī)的PWM輸出引腳。這里我們選擇STC89C52的P2.0口作為PWM輸出口。OUT1和OUT2連接到直流電機(jī)的兩個接線柱。L298N的電源端VCC連接12V,邏輯電源VSS連接5V。

  • 編碼器信號處理電路:編碼器的VCC和GND連接到5V電源。其A相和B相輸出信號,通常是開漏輸出,因此需要接上拉電阻(4.7kΩ)到5V電源。然后將上拉后的A相和B相信號分別接到單片機(jī)的兩個外部中斷引腳,例如INT0(P3.2)和INT1(P3.3)。通過外部中斷來捕捉編碼器的脈沖,可以保證脈沖不會丟失,從而實現(xiàn)精確計數(shù)。

3.2 系統(tǒng)接線圖

為了清晰起見,我們將以文字描述的方式呈現(xiàn)一個簡化的接線圖,方便讀者理解和搭建。

  • 單片機(jī)部分

    • VCC接5V,GND接GND。

    • RST引腳接復(fù)位電路。

    • XTAL1和XTAL2引腳接12MHz晶振和兩個22pF電容。

    • P3.2 (INT0) 接編碼器的A相輸出。

    • P3.3 (INT1) 接編碼器的B相輸出。

    • P2.0 (PWM輸出) 接L298N的EN A引腳。

    • P1.0 接L298N的IN1引腳。

    • P1.1 接L298N的IN2引腳。

    • P0口或P2口可連接一個LCD1602液晶屏,用于顯示目標(biāo)轉(zhuǎn)速、當(dāng)前轉(zhuǎn)速和PID參數(shù),便于調(diào)試。

  • 電機(jī)驅(qū)動部分 (L298N模塊)

    • 12V電源輸入:接12V直流電源正極。

    • GND:接12V電源負(fù)極。

    • 5V電源輸入:接5V穩(wěn)壓電源正極(單片機(jī)5V電源)。

    • ENA:接單片機(jī)P2.0。

    • IN1:接單片機(jī)P1.0。

    • IN2:接單片機(jī)P1.1。

    • OUT1和OUT2:接直流電機(jī)的兩個接線柱。

    • L298N的邏輯供電(5V)和單片機(jī)的供電需要共地。

  • 編碼器部分

    • VCC:接5V電源。

    • GND:接GND。

    • A相輸出:接上拉電阻后到單片機(jī)P3.2 (INT0)。

    • B相輸出:接上拉電阻后到單片機(jī)P3.3 (INT1)。

4. 軟件設(shè)計與驅(qū)動程序?qū)崿F(xiàn)

軟件是整個系統(tǒng)的“大腦”,負(fù)責(zé)執(zhí)行PID算法、處理編碼器信號、生成PWM波形和與用戶交互。這里我們將詳細(xì)講解關(guān)鍵的驅(qū)動程序和PID算法實現(xiàn)。

4.1 編碼器脈沖計數(shù)與方向判斷

編碼器信號的精確讀取是PID控制的基礎(chǔ)。我們采用定時器中斷結(jié)合外部中斷的方式來處理編碼器信號,以實現(xiàn)高精度計數(shù)。

C

// 編碼器相關(guān)變量volatile int pulse_count = 0;   
// 編碼器脈沖計數(shù)sbit ENCODER_A = P3^2;          
// 編碼器A相信號sbit ENCODER_B = P3^3;          
// 編碼器B相信號int direction = 1;              
// 1為正轉(zhuǎn),-1為反轉(zhuǎn)// 外部中斷0服務(wù)函數(shù)(用于捕捉A相脈沖)void ext0_isr() interrupt 0{    
// 判斷方向:如果A相脈沖來了,看看B相電平是高還是低
   // 假設(shè)A超前B為正轉(zhuǎn),則當(dāng)A相上升沿到來時,B相為低電平
   if (ENCODER_B == 0)
   {
       pulse_count++;
   }    else
   {
       pulse_count--;
   }
}// 定時器1中斷服務(wù)函數(shù)(用于定時計算轉(zhuǎn)速)void timer1_isr() interrupt 3{    
// 假設(shè)定時器1每隔50ms中斷一次
   // 在這里計算轉(zhuǎn)速,并清零脈沖計數(shù)器
   // 轉(zhuǎn)速 = (pulse_count / 編碼器分辨率) * (60 / 0.05)
   // 假設(shè)分辨率是1440,則轉(zhuǎn)速(rpm) = (pulse_count / 1440) * 1200
   // 然后將pulse_count清零
   
   // ... 其他PID控制計算 ...}

4.2 PWM信號生成

STC89C52的定時器2是一個功能強(qiáng)大的定時器,特別適合用來產(chǎn)生PWM波。我們可以將定時器2配置為自動重裝載模式,并使用其溢出中斷來改變PWM輸出引腳的電平,從而實現(xiàn)PWM波形。

C

// 初始化定時器2用于PWMvoid PWM_Init(){    // 設(shè)置定時器2為16位自動重裝載模式
   T2CON = 0x00;   // 清除所有控制位
   T2MOD = 0x00;    
   // 假設(shè)系統(tǒng)時鐘為12MHz,我們想生成一個頻率為10kHz的PWM波
   // 周期T = 1/10kHz = 100us。 機(jī)器周期 = 1/12M * 12 = 1us
   // 定時器2的重裝載值 = 100us / 1us = 100
   // 計數(shù)器初值 = 65536 - 100
   TL2 = (65536 - 100) & 0xFF;
   TH2 = (65536 - 100) >> 8;    
   // 啟用定時器2
   TR2 = 1;    
   // 設(shè)置PWM輸出引腳為P2.0
   // 假設(shè)我們使用一個軟件PWM,而不是硬件PWM
   // 那么需要在定時器2中斷里改變P2.0的電平
   
   // 或者,我們可以使用一個更簡單的軟件PWM方法:
   // 在一個固定的循環(huán)中,根據(jù)設(shè)定的占空比來改變P2.0的電平
   // 例如,占空比為50,則在高電平50個周期后,拉低電平50個周期,如此往復(fù)
   
   // 為了實現(xiàn)PID,我們只需要改變PWM的占空比即可。
   // PWM_duty_cycle是一個0-100的變量
   // 在定時器2中斷中,我們判斷當(dāng)前計數(shù)器值,來決定P2.0的電平}
   // 假設(shè)我們使用一個簡單的軟件PWM函數(shù)void Set_PWM(int duty){    
   // 限制占空比范圍在0-100之間
   if (duty < 0) duty = 0;    if (duty > 100) duty = 100;    
   // 這里需要一個定時器或延時函數(shù)來控制PWM周期
   // 假設(shè)PWM_PERIOD_US為100us
   int high_time_us = (long)duty * PWM_PERIOD_US / 100;    
   int low_time_us = PWM_PERIOD_US - high_time_us;    
   // 循環(huán)產(chǎn)生PWM波形
   P2_0 = 1;
   delay_us(high_time_us);
   P2_0 = 0;
   delay_us(low_time_us);
}

注意:在實際應(yīng)用中,為了不占用CPU時間,我們通常會使用定時器配合外部中斷或者硬件PWM模塊來產(chǎn)生PWM波形。STC89C52的定時器2可以配置為PWM輸出模式,但需要復(fù)雜的寄存器配置,這里為了說明原理,我們用軟件方法簡化,但在實際項目中,應(yīng)優(yōu)先考慮硬件PWM。

4.3 PID控制算法實現(xiàn)

PID控制算法是整個系統(tǒng)的核心。我們采用位置式PID算法,其公式為:

u(k)=K_pe(k)+K_isum_j=0ke(j)Deltat+K_dfrace(k)?e(k?1)Deltat

其中:

  • u(k) 是第k次采樣的控制輸出量,即PWM占空比。

  • e(k) 是第k次采樣的偏差,即目標(biāo)轉(zhuǎn)速 - 實際轉(zhuǎn)速。

  • K_p, K_i, K_d 分別是比例、積分和微分系數(shù)。

C

// PID相關(guān)變量float Kp = 1.0;float Ki = 0.5;float Kd = 0.1;float set_speed = 100.0;     
// 目標(biāo)轉(zhuǎn)速(rpm)float current_speed = 0.0;  
// 當(dāng)前轉(zhuǎn)速(rpm)float error = 0.0;          
// 當(dāng)前偏差float last_error = 0.0;      
// 上一次偏差float integral_error = 0.0;  
// 積分項累加int pwm_output = 0;          
// PWM占空比輸出// PID控制函數(shù),在定時器中斷中周期性調(diào)用void PID_Control(){    
// 1. 計算偏差
   error = set_speed - current_speed;    
   // 2. 累加積分項
   integral_error += error;    
   // 3. 限制積分飽和,防止系統(tǒng)震蕩
   if (integral_error > 2000) integral_error = 2000;    
   if (integral_error < -2000) integral_error = -2000;    
   // 4. 計算PWM輸出
   pwm_output = Kp * error + Ki * integral_error + Kd * (error - last_error);    
   // 5. 更新上一次偏差
   last_error = error;    
   // 6. 限制PWM輸出范圍在0-100之間
   if (pwm_output > 100) pwm_output = 100;    if (pwm_output < 0) pwm_output = 0;    
   // 7. 將PWM輸出值應(yīng)用到電機(jī)
   Set_PWM(pwm_output);
}

PID參數(shù)整定是PID控制的關(guān)鍵,通常采用試湊法Ziegler-Nichols方法

  • 首先只設(shè)置K_p:從小到大增加K_p,直到系統(tǒng)出現(xiàn)等幅振蕩,記錄此時的K_p值和振蕩周期。

  • 引入K_i:在K_p的基礎(chǔ)上增加K_i,用于消除靜差。

  • 引入K_d:在K_p和K_i的基礎(chǔ)上增加K_d,用于抑制超調(diào),提高系統(tǒng)響應(yīng)速度。 實際操作中,通常需要反復(fù)試驗,以找到最佳的PID參數(shù)組合。

4.4 主程序與流程

C

void main(){    // 初始化外設(shè)
   Init_LCD();             // 初始化LCD1602用于顯示
   Init_Timer1();          // 初始化定時器1用于定時采樣
   Init_External_Interrupt(); // 初始化外部中斷0用于編碼器計數(shù)
   
   EA = 1; // 開啟總中斷
   
   while(1)
   {        // 主循環(huán),可以用于讀取目標(biāo)轉(zhuǎn)速、顯示信息等
       // 這里可以從串口讀取新的目標(biāo)轉(zhuǎn)速
       // 在定時器中斷中,會周期性地進(jìn)行PID計算和PWM更新
       
       // 顯示當(dāng)前轉(zhuǎn)速和目標(biāo)轉(zhuǎn)速
       Display_Info(current_speed, set_speed);
   }
}

5. 總結(jié)與展望

本文詳細(xì)闡述了基于51單片機(jī)的PID直流電機(jī)驅(qū)動系統(tǒng)的設(shè)計與實現(xiàn),從硬件元器件的精心選擇,到硬件電路的詳細(xì)接線,再到軟件驅(qū)動程序的精細(xì)編寫,都進(jìn)行了全面的剖析。通過對STC89C52RC、L298N和光電編碼器等核心元器件的深入分析,我們理解了它們在系統(tǒng)中的關(guān)鍵作用。通過采用定時器中斷結(jié)合外部中斷的方式,我們實現(xiàn)了高精度的編碼器脈沖計數(shù),為PID控制提供了準(zhǔn)確的反饋數(shù)據(jù)。最后,我們給出了位置式PID算法的C語言實現(xiàn)代碼,并簡要介紹了PID參數(shù)的整定方法。

本設(shè)計具有成本低廉、技術(shù)成熟、易于學(xué)習(xí)和擴(kuò)展的優(yōu)點(diǎn),非常適合作為嵌入式控制領(lǐng)域的入門項目。然而,這套系統(tǒng)仍然存在一些可以改進(jìn)和優(yōu)化的空間。例如,可以采用增量式PID算法,以避免積分飽和問題;可以引入串行通信,通過上位機(jī)實時監(jiān)控和調(diào)整PID參數(shù),提高調(diào)試效率;還可以升級到更高性能的單片機(jī),如STM32系列,以處理更復(fù)雜的算法和實現(xiàn)更高級的功能,例如多電機(jī)協(xié)調(diào)控制、電機(jī)軌跡規(guī)劃等。但對于大多數(shù)基礎(chǔ)的調(diào)速和位置控制應(yīng)用,本設(shè)計方案已經(jīng)完全足夠,并為進(jìn)一步的深入學(xué)習(xí)和實踐奠定了堅實的基礎(chǔ)。通過這樣的項目實踐,不僅可以掌握51單片機(jī)的應(yīng)用,更能深入理解閉環(huán)控制系統(tǒng)的核心思想和PID算法的精髓。

責(zé)任編輯:David

【免責(zé)聲明】

1、本文內(nèi)容、數(shù)據(jù)、圖表等來源于網(wǎng)絡(luò)引用或其他公開資料,版權(quán)歸屬原作者、原發(fā)表出處。若版權(quán)所有方對本文的引用持有異議,請聯(lián)系拍明芯城(marketing@iczoom.com),本方將及時處理。

2、本文的引用僅供讀者交流學(xué)習(xí)使用,不涉及商業(yè)目的。

3、本文內(nèi)容僅代表作者觀點(diǎn),拍明芯城不對內(nèi)容的準(zhǔn)確性、可靠性或完整性提供明示或暗示的保證。讀者閱讀本文后做出的決定或行為,是基于自主意愿和獨(dú)立判斷做出的,請讀者明確相關(guān)結(jié)果。

4、如需轉(zhuǎn)載本方擁有版權(quán)的文章,請聯(lián)系拍明芯城(marketing@iczoom.com)注明“轉(zhuǎn)載原因”。未經(jīng)允許私自轉(zhuǎn)載拍明芯城將保留追究其法律責(zé)任的權(quán)利。

拍明芯城擁有對此聲明的最終解釋權(quán)。

上一篇: 已是第一篇
標(biāo)簽: 51單片機(jī) PID電機(jī)

相關(guān)資訊

拍明芯城微信圖標(biāo)

各大手機(jī)應(yīng)用商城搜索“拍明芯城”

下載客戶端,隨時隨地買賣元器件!

拍明芯城公眾號
拍明芯城抖音
拍明芯城b站
拍明芯城頭條
拍明芯城微博
拍明芯城視頻號
拍明
廣告
恒捷廣告
廣告
深亞廣告
廣告
原廠直供
廣告