江科大51單片機筆記【15】直流電機驅動(PWM)

寫在前言

? 此為博主自學江科大51單片機(B站)的筆記,方便后續重溫知識

? 在后面的章節中,為了防止篇幅過長和易于查找,我把一個小節分成兩部分來發,上章節主要是關于本節課的硬件介紹、電路圖、原理圖等理論知識,主要是為下章節的代碼部分打基礎。

? 我的單片機是24年12月在tb普中買的,型號是STC89C52,在原視頻中引腳或接口不對應的我都會改正,保證在我的機子上能運行才發上來的,還有一些文字部分是我的理解,并非照搬,所以可能有理解不到位的現象。

??如有誤或交流,敬請指點提問

本節課一共兩個代碼,LED呼吸燈和直流電機調速

一、直流電機

1.介紹

  • 直流電機是一種將電能轉換為機械能的裝置。一般的直流電機有兩個電極,當電極正接時,電機正轉,當電極反接時,電機反轉
  • 直流電機主要由永磁體(定子)、線圈(轉子)和換向器組成
  • 除直流電機外,常見的電機還有步進電機(機殼裝載了一圈電磁鐵,對相對兩個電磁鐵進行一圈脈沖式通電,優點是嚴格控速精密)、舵機(跟船舵一樣,方便控制轉向)、無刷電機(轉速特別快)、空心杯電機(體積很小)等
  • 左1就是我們開發板里的電機,有兩個電極;左1是N20,一個直流電機+減速箱;右1比左2還多帶一個編碼器(測速),PID算法(常用)控制電機速度

2.驅動電路

有兩種方式

  • 大功率器件直接驅動?

不能正反轉上面是一個三極管控制開關,下面是一個蓄流二極管,用于保護電路;因為電機(繼電器)是感性負載元件,驅動的時候會出現很高的電壓(電感的特效)

這個ULN2003里面也是一個大功率元件

  • H橋驅動

能正反轉因為我們使第二、四象限的二極管導通其余的截止,就會令電流向右走,如果反過來就可以令電流向左走;因為沒有蓄流二極管保護,所以對mos管和晶體管的耐壓特效要求比較高

二、PWM

PWM是控制直流電機調速的


1.介紹

  • PWM(Pulse Width Modulation)即脈沖寬度調制,在具有慣性的系統中,可以通過對一系列脈沖的寬度進行調制,來等效地獲得所需要的模擬參量,常應用于電機控速、開關電源等領域
  • PWM重要參數:
  • 頻率=1/Ts? 占空比=Ton/Ts? 精度=占空比變化步距

三、代碼實戰

1.LED呼吸燈?

先定義一下引腳

然后再定義一個比較快的延時函數,讓這個LED燈先亮一段時間,再滅一段時間,這就是PWM的工作原理,通常為了保證周期是穩定的,不隨占空比變化而變化,所以亮和滅加起來的時間也要是個固定值

#include <REGX52.H>sbit LED=P2^0;void Delay(unsigned int t)
{while(t--);
}void main()
{while(1){LED=0;Delay(5);LED=1;Delay(95);}
}

接下來就是讓亮和滅的值不斷變化,從而實現呼吸燈的效果

我們就可以定義一個變量Time,讓亮的時間為Time,滅的時間為100-Time,這樣就可以實現兩個數加起來是固定值,然后我們再對Time進行for循環,不斷++

但是這個速度還是比較快,我們讓他每次亮滅變換的時間再久一點,定義一個i,在for循環里嵌套再進行一次for循環,這樣就可以實現LED一直從暗到亮

但是我們還想實現從暗到亮,再從亮到暗又怎么做呢,就是把之前的外層對Time的for循環反過來再依次--

#include <REGX52.H>sbit LED=P2^0;void Delay(unsigned int t)
{while(t--);
}void main()
{unsigned char Time,i;while(1){for(Time=0;Time<100;Time++){for(i=0;i<20;i++){LED=0;Delay(Time);LED=1;Delay(100-Time);				}}for(Time=100;Time>0;Time--){for(i=0;i<20;i++){LED=0;Delay(Time);LED=1;Delay(100-Time);				}}}
}

這樣就可以實現呼吸燈從暗到亮,再從亮到暗

但是會有一個缺點,就是占用了我們的主循環不斷翻轉IO口,還比較占用CPU

一般都會寫到定時器上,或者從硬件上解決

所以在下面的代碼中我們用定時器來實現

2.直流電機調速

在這個代碼我們就用定時器來實現LED呼吸燈和直流電機調速功能

產生PWM方法

我們通過改變比較值就可以改變占空比?

由于之前的定時器設置有點慢,我們讓他快一點

這個PWM驅動電機在一定范圍內是越快越好,一般設置在10K-20K范圍里,如果頻率比較低,電流就會抖動,如果在1K左右,就會產生一些蜂鳴器的聲音

這個中斷就是每隔100us中斷一次

//timer0.c#include <REGX52.H>/*** @brief  定時器0初始化,100us@12.000MHz* @param  無* @retval 無*/
void Timer0_Init(void)
{TMOD &= 0xF0;		//設置定時器模式TMOD |= 0x01;		//設置定時器模式TL0 = 0xA4;		//設置定時初值TH0 = 0xFF;		//設置定時初值TF0 = 0;		//清除TF0標志TR0 = 1;		//定時器0開始計時ET0=1;EA=1;PT0=0;
}/*定時器中斷函數模板
void Timer0_Routine() interrupt 1
{static unsigned int T0Count;TL0 = 0xA4;		//設置定時初值TH0 = 0xFF;		//設置定時初值T0Count++;if(T0Count>=1000){T0Count=0;}
}
*/

由上面的圖可以知道要定義兩個值,計數值和比較值,

我們讓計數值從0-100然后清零,實現定時自增

?? ?Counter++;
?? ?Counter%=100;

這樣寫和if(counter==100){清零}是一個效果

接下來再讓計數值和比較值進行比較

可以觀察到如果比較值越大,低電平時間越久,也就是越暗

這樣我們通過控制比較值Compare就可以控制LED的亮度,還剩下下了主循環,接下來我們就實現按鍵功能

#include <REGX52.H>
#include " Delay.h"
#include " Key.h"
#include " Nixie.h"
#include " Timer0.h"sbit LED=P2^0;unsigned char Counter,Compare;void main()
{Timer0_Init();Compare=5;while(1){}}void Timer0_Routine() interrupt 1
{TL0 = 0xA4;		//設置定時初值TH0 = 0xFF;		//設置定時初值Counter++;Counter%=100;if(Counter<Compare){LED=0;}else{LED=1;}
}

注意后面取的Key函數,如果是拿的定時器掃描按鍵的那章寫的Key函數,要在定時器中寫上這個Key_Loop()

#include <REGX52.H>
#include " Delay.h"
#include " Key.h"
#include " Nixie.h"
#include " Timer0.h"sbit LED=P2^0;unsigned char Counter,Compare;
unsigned char KeyNum,Speed;void main()
{Timer0_Init();Compare=5;while(1){KeyNum=Key();if(KeyNum==1){Speed++;Speed%=4;}Nixie(1,Speed);}}void Timer0_Routine() interrupt 1
{Key_Loop();TL0 = 0xA4;		//設置定時初值TH0 = 0xFF;		//設置定時初值Counter++;Counter%=100;if(Counter<Compare){LED=0;}else{LED=1;}
}

這樣就可以實現按下按鍵1數碼管顯示++并且過3就清零

接下來將Speed跟Compare比較值對應起來,就可以實現按鍵調速并顯示

這樣就可以實現LED的亮度控制

?? ??? ??? ?if(Speed==0){Compare=5;}
?? ??? ??? ?if(Speed==1){Compare=5;}
?? ??? ??? ?if(Speed==2){Compare=50;}
?? ??? ??? ?if(Speed==3){Compare=100;}?? ?

那我們如果想控制電機,就直接把LED的端口改成電機的端口,而又因為我們的LED是給0亮給1滅,而電機是給1轉給0滅,所以需要把極性反過來

這里有個小問題,在剛上電的時候,電機會轉動,這是硬件的問題,因為單片機在復位的時候,IO口默認高電平,所以電機會轉

#include <REGX52.H>
#include " Delay.h"
#include " Key.h"
#include " Nixie.h"
#include " Timer0.h"sbit Motor=P1^0;unsigned char Counter,Compare;
unsigned char KeyNum,Speed;void main()
{Timer0_Init();Compare=5;while(1){KeyNum=Key();if(KeyNum==1){Speed++;Speed%=4;if(Speed==0){Compare=0;}if(Speed==1){Compare=50;}if(Speed==2){Compare=75;}if(Speed==3){Compare=100;}	}Nixie(1,Speed);}}void Timer0_Routine() interrupt 1
{Key_Loop();TL0 = 0xA4;		//設置定時初值TH0 = 0xFF;		//設置定時初值Counter++;Counter%=100;if(Counter<Compare){Motor=1;}else{Motor=0;}
}

這樣就實現本節課的代碼啦,按下按鍵調節電機的速度并且顯示出來。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/73195.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/73195.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/73195.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

鴻蒙模擬器運行NDK項目失敗 9568347

鴻蒙編譯NDK項目 模擬器運行NDK項目失敗 9568347 23:32:17.572: $ hdc file send D:\study\hongmeng\MyTestNdk\entry\build\default\outputs\default\entry-default-unsigned.hap "data/local/tmp/9fff4611338a424bb31b521bdc3555af" in 30 ms 23:32:17.651: $ hd…

uniapp+Vue3 開發小程序的下載文件功能

小程序下載文件&#xff0c;可以先預覽文件內容&#xff0c;然后在手機上打開文件的工具中選擇保存。 簡單示例&#xff1a;&#xff08;復制到HBuilder直接食用即可&#xff09; <template><view class"container-detail"><view class"example…

電機控制常見面試問題(九)

文章目錄 一、談談電機死區時間1.死區時間過短的后果&#xff1a;2.如何判斷死區時間不足?3.解決方案 二、請描述對實時操作系統&#xff08;RTOS&#xff09;的理解三.解釋FOC算法的原理并比較與其他無刷電機控制算法的優劣四.什么是電機堵轉&#xff0c;如何避免電機堵轉五.…

【分布式】聊聊分布式id實現方案和生產經驗

對于分布式Id來說&#xff0c;在面試過程中也是高頻面試題&#xff0c;所以主要針對分布式id實現方案進行詳細分析下。 應用場景 對于無論是單機還是分布式系統來說&#xff0c;對于很多場景需要全局唯一ID&#xff0c; 數據庫id唯一性日志traceId 可以方便找到日志鏈&#…

【性能測試】Jmeter如何做一份測試報告(3)

本篇文章主要介紹Jmeter中下載插件&#xff08;Jmeter Plugins&#xff09; 如何使用監聽器插件&#xff0c;線程組插件&#xff0c;梯度壓測線程組 測試報告需要去關注的數據&#xff0c;怎么看測試報告圖表 目錄 一&#xff1a;插件下載 1&#xff1a;下載地址 2&#xff…

cocos creator使用mesh修改圖片為圓形,減少使用mask,j減少drawcall,優化性能

cocos creator版本2.4.11 一個mask占用drawcall 3個以上&#xff0c;針對游戲中技能圖標&#xff0c;cd,以及多玩家頭像&#xff0c;是有很大優化空間 1.上代碼&#xff0c;只適合單獨圖片的&#xff0c;不適合在圖集中的圖片 const { ccclass, property } cc._decorator;c…

AI重構SEO關鍵詞布局

內容概要 在搜索引擎優化&#xff08;SEO&#xff09;領域&#xff0c;AI技術的深度應用正在顛覆傳統關鍵詞布局邏輯。通過機器學習算法與語義分析模型&#xff0c;智能系統能夠實時解析海量搜索數據&#xff0c;構建動態詞庫并精準捕捉用戶意圖。相較于依賴人工經驗的關鍵詞篩…

泛微ecode的頁面開發發送請求參數攜帶集合

1.在開發過程中我們難免遇見會存在需要將集合傳遞到后端的情況&#xff0c;那么這里就有一些如下的注意事項&#xff0c;如以下代碼&#xff1a; // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…

20250212:linux系統DNS解析卡頓5秒的bug

問題: 1:人臉離線識別記錄可以正常上傳云端 2:人臉在線識別請求卻一直超時 3:客戶使用在線網絡 思路:

道路運輸安全員考試:備考中的心理調適與策略

備考道路運輸安全員考試&#xff0c;心理調適同樣重要。考試壓力往往會影響考生的學習效率和考試發揮。? 首先&#xff0c;要正確認識考試壓力。適度的壓力可以激發學習動力&#xff0c;但過度的壓力則會適得其反。當感到壓力過大時&#xff0c;要學會自我調節。可以通過運動…

LLM - 白話RAG(Retrieval-Augmented Generation)

文章目錄 Pre一、大模型的"幻覺"之謎1.1 何為"幻覺"現象&#xff1f;1.2 專業場景的致命挑戰 二、RAG技術解析&#xff1a;給大模型裝上"知識外掛"2.1 核心原理&#xff1a;動態知識增強2.2 技術實現三部曲 三、RAG vs 微調&#xff1a;技術選型…

探索現代 C++:新特性、工程實踐與熱點趨勢

目錄 一、現代 C 的關鍵特性與熱點關聯 二、精簡代碼示例解析 三、工程實踐中的應用思考 四、總結與展望 近幾年&#xff0c;人工智能、邊緣計算與跨語言開發成為技術熱點&#xff0c;而 C 作為高性能系統編程的主力軍&#xff0c;也在不斷進化。從 C11 到 C20&#xff0c;…

《HTML + CSS + JS 打造炫酷輪播圖詳解》

《HTML CSS JS 打造炫酷輪播圖詳解》 一、項目概述 本次項目旨在使用 HTML、CSS 和 JavaScript 實現一個具有基本功能的輪播圖&#xff0c;包括圖片自動輪播、上一張 / 下一張按鈕切換、小圓點指示與切換等功能&#xff0c;以提升網頁的交互性和視覺吸引力。 二、實現步驟…

257. 二叉樹的所有路徑(遞歸+回溯)

257. 二叉樹的所有路徑 力扣題目鏈接(opens new window) 給定一個二叉樹&#xff0c;返回所有從根節點到葉子節點的路徑。 說明: 葉子節點是指沒有子節點的節點。 示例: 思路&#xff1a;在葉子節點收割結果&#xff0c;如果不是葉子節點&#xff0c;則依次處理左右子樹&a…

【架構差異】SpringとSpringBoot:Bean機制的深入剖析與自動配置原理

目錄標題 SpringBoot框架中Bean機制的深入剖析與自動配置原理摘要1. 引言2. SpringBoot與Spring的架構差異2.1 從Spring到SpringBoot的演進2.2 SpringBoot中的Bean容器體系 3. SpringBoot的自動配置機制3.1 SpringBootApplication解析3.2 自動配置原理深度解析3.2.1 自動配置類…

CSDN博客:Markdown編輯語法教程總結教程(中)

?個人主頁&#xff1a;折枝寄北的博客 Markdown編輯語法教程總結 前言1. 列表1.1 無序列表1.2 有序列表1.3 待辦事項列表1.4 自定義列表 2. 圖片2.1 直接插入圖片2.2 插入帶尺寸的圖片2.3 插入寬度確定&#xff0c;高度等比例的圖片2.4 插入高度確定寬度等比例的圖片2.5 插入居…

ChebyKAN0、ChebyKAN1 網絡閱讀

目錄 ChebyKAN0 Chebyshev Polynomial-Based Kolmogorov-Arnold Networks: An Efficient Architecture for Nonlinear Function Approximation 參考文獻 文章內容 文章詳細結構 5. Experiments and Results 5.1 Digit Classification on MNIST 5.2 Function Approximat…

RK3588部署YOLOv8(2):OpenCV和RGA實現模型前處理對比

目錄 前言 1. 結果對比 1.1 時間對比 1.2 CPU和NPU占用對比 2. RGA實現YOLO前處理 2.1 實現思路 2.2 處理類的聲明 2.3 處理類的實現 總結 前言 RK平臺上有RGA (Raster Graphic Acceleration Unit) 加速&#xff0c;使用RGA可以減少資源占用、加速圖片處理速度。因此…

破局者登場:中國首款AI原生IDE Trae深度解析--開啟人機協同編程新紀元

摘要 字節跳動于2025年3月3日正式發布中國首款AI原生集成開發環境Trae國內版&#xff0c;以動態協作、全場景AI賦能及本土化適配為核心優勢。Trae內置Doubao-1.5-pro與DeepSeek R1/V3雙引擎&#xff0c;支持基于自然語言生成端到端代碼框架、實時上下文感知與智能Bug修復&…

【PyCharm】Python和PyCharm的相互關系和使用聯動介紹

李升偉 整理 Python 是一種廣泛使用的編程語言&#xff0c;而 PyCharm 是 JetBrains 開發的專門用于 Python 開發的集成開發環境&#xff08;IDE&#xff09;。以下是它們的相互關系和使用聯動的介紹&#xff1a; 1. Python 和 PyCharm 的關系 Python&#xff1a;一種解釋型、…