厲害了我的單片機!看它如何控制PWM信號實現直流電機轉速控制~

2022-01-16 麵包板社區

#include "reg52.h"

#define uchar unsigned char

#define uint unsigned int

uchar code table[10]={0x3f,0x06,0x5b,

0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f}; //共陰數碼管顯示碼(0-9)

sbit xiaoshudian=P0^7;

sbit wei1=P2^4; //數碼管位選定義

sbit wei2=P2^5;

sbit wei3=P2^6;

sbit wei4=P2^7;

sbit beep=P2^3; //蜂鳴器控制端

sbit motor = P1^0; //電機控制

sbit s1_jiasu = P1^4; //加速按鍵

sbit s2_jiansu= P1^5; //減速按鍵

sbit s3_jiting=P1^6; //停止/開始按鍵

uint pulse_count; //INT0接收到的脈衝數

uint num=0; //num相當於佔空比調節的精度

uchar speed[3]; //四位速度值存儲

float bianhuasudu; //當前速度(理論計算值)

float reallyspeed; //實際測得的速度

float vv_min=0.0;vv_max=250.0;

float vi_Ref=60.0; //給定值

float vi_PreError,vi_PreDerror;

uint pwm=100; //相當於佔空比標誌變量

int sample_time=0; //採樣標誌

float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,積分,微分常數

void delay (uint z)

{

uint x,y;

for(x=z;x>0;x--)

for (y=20;y>0;y--);

}

void time_init()

{

ET1=1; //允許定時器T1中斷

ET0=1; //允許定時器T0中斷

TMOD = 0x15; //定時器0計數,模式1;定時器1定時,模式1

TH1 = (65536-100)/256; //定時器1值,負責PID中斷 ,0.1ms定時

TL1 = (65536-100)%6;

TR0 = 1; //開定時器

TR1 = 1;

IP=0X08; //定時器1為高優級

EA=1; //開總中斷

}

void keyscan()

{

float j;

if(s1_jiasu==0) //加速

{

delay(20);

if(s1_jiasu==0)

vi_Ref+=10;

j=vi_Ref;

}

while(s1_jiasu==0);

if(s2_jiansu==0) //減速

{

delay(20);

if(s2_jiansu==0)

vi_Ref-=10;

j=vi_Ref;

}

while(s2_jiansu==0);

if(s3_jiting==0)

{

delay(20);

motor=0;

P1=0X00;

P3=0X00;

P0=0x00;

}

while(s3_jiting==0);

}

float v_PIDCalc(float vi_Ref,float vi_SpeedBack)

{

register float error1,d_error,dd_error;

error1=vi_Ref-vi_SpeedBack; //偏差的計算

d_error=error1-vi_PreError; //誤差的偏差

dd_error=d_error-vi_PreDerror; //誤差變化率

vi_PreError=error1; //存儲當前偏差

vi_PreDerror=d_error;

bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);

return (bianhuasudu);

}

void v_Display()

{

uint sudu;

sudu=(int)(reallyspeed*10); //乘以10之後強制轉化成整型

speed[3]=sudu/1000; //百位

speed[2]=(sudu00)/100; //十位

speed[1]=(sudu0)/10; //個位

speed[0]=sudu; //小數點後一位

wei1=0; //第一位打開

P0=table[speed[3]];

delay(5);

wei1=1; //第一位關閉

wei2=0;

P0=table[speed[2]];

delay(5);

wei2=1;

wei3=0;

P0=table[speed[1]];

xiaoshudian=1;

delay(5);

wei3=1;

wei4=0;

P0=table[speed[0]];

delay(5);

wei4=1;

}

void BEEP()

{

if((reallyspeed)>=vi_Ref+5||(reallyspeed

{

beep=~beep;

delay(4);

}

}

void main()

{

time_init();

motor=0;

while(1)

{

v_Display();

BEEP();

}

if(s3_jiting==0) //對按鍵3進行掃描,增強急停效果

{

delay(20);

motor=0;

P1=0X00;

P3=0X00;

P0=0x00;

}

while(s3_jiting==0);

}

void timer0() interrupt 1

{

}

void timer1() interrupt 3

{

TH1 = (65536-100)/256; //1ms定時

TL1 = (65536-100)%6;

sample_time++;

if(sample_time==5000) //採樣時間0.1ms*5000=0.5s

{

TR0=0; //關閉定時器0

sample_time=0;

pulse_count=TH0*255+TL0; //保存當前脈衝數

keyscan(); //掃描按鍵

reallyspeed=pulse_count/(4*0.6); //計算速度

pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);

if(pwm

if(pwm>100)pwm=100;

TH0=TL0=0;

TR0=1; //開啟定時器0

}

num++;

if(num==pwm) //此處的num值,就是佔空比

{

motor=0;

}

if(num==100) //100相當於佔空比調節的精度

{

num=0;

motor=1;

}

}

相關焦點

  • 基於ATmega8的直流電機PWM調速控制系統設計與實現
    對直流電機的轉速控制方法可分為對勵磁磁通進行控制的勵磁控制法和對電樞電壓進行控制的電樞控制方法。目前絕大多數直流電機採用開關驅動方式,它是使半導體功率器件工作在開關狀態,通過脈寬調製PWM來控制電機電樞電壓,實現調速。
  • PWM控制MOSFET搭建的H橋電路驅動直流電機仿真與單片機源碼
    PIC單片機 proteus H橋驅動直流電機PWM控制MOSFET搭建的H橋電路驅動直流電機運行仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)設計的PWM控制器控制H橋電路(MOSFET)驅動直流電機運行//-----------------------------------------------------------------//  說明: 本例使用PIC16F690的增強型PWM模塊(P1A,P1B,P1C,P1D)實現對直流//        電機運行控制,包括運行/停止/正反轉及速度調節
  • 基於Arduino與LabVIEW的直流電機轉速控制系統
    例如,通過增量式編碼器來測量電機的轉速,常規的單片機的程序架構是通過定時器來實現精確的時間定時,並利用外部中斷來實現對脈衝數目的計數,然後計算出一定時間內脈衝的數目,從而得到轉速數值並輸出。直流電機是Arduino機器人製作中的主要動力來源,但是由於電機的參數一致性有所差別,即使是相同型號的電機在相同電壓下的轉速都不完全相同,而且在帶負載或負載不同的情況下,更加會導致電機轉速發生變化,這就會導致製作的Arduino輪式機器人不能實現直線行走,因為這是一個開環控制,沒有任何反饋信號返回。
  • 任務發布--直流減速電機控制
    《直流減速電機控制》教學單元設計任務書一、教學單元基本情況教學內容:直流減速電機控制學時安排:4學時(4節連上) 適應專業:電子信息工程二、項目設計的意義、目標與要求2 目標通過典型實際的問題,訓練學生的軟硬體的綜合設計、調試能力以及文字組織能力,建立系統設計概念,加強工程應用思維方式的訓練,同時對教學內容做一定的擴充。
  • 有刷直流電機的工作原理及控制電路
    綜合了並激和串激電機的性能,它具有大轉矩與精準的速度控制優勢。例如,如果額定直流電機在12V時以轉速7000 RPM旋轉,則當給電機施加佔空比為50%的信號時,則電機將 (理想情況下)以3500 RPM的轉速旋轉。PWM信號的頻率是考慮的重點。頻率太低會導致電機轉速過低,噪音較大,並且對佔空比變化的響應過慢(關於速度控制前面已有文章描述過,這時再重複下)。頻率太高,則會因開關設備的開關損耗而降低系統的效率。
  • 步進電機的單片機控制
    本設計採用凌陽16 位單片機SPCE061A對步進電機進行控制,通過IO口輸出的具有時序的方波作為步進電機的控制信號,信號經過晶片L298N驅動步進電機;同時,用4X4的鍵盤來對電機的狀態進行控制,並用數碼管顯示電機的轉速,採用74LS164作為4位單個數碼管的顯示驅動,從單片機
  • 用51單片機實現pwm專題及常見問題 - CSDN
    基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目一、前言1、基於51單片機脈衝寬度調製(即PWM)直流電機轉速快慢以及霍爾測速的項目包括用Keil軟體編寫單片機C語言程序和用
  • 如何控制直流電機及調速?
    控制直流電機,需要直流電機驅動,無非是控制電機正反轉和轉速。若是新手,不知道怎麼設計直流電機驅動電路,可以直接購買電機驅動模塊,市面上這種功能模塊非常多,比如L298N電機驅動模塊。通過給IN1、IN2高低電平控制電機的狀態,其中ENA、ENB為使能端,低電平無效,高電平使能。
  • 直流電機的IR2110驅動控制設計及DSP實現
    目前,直流電機控制數位化已成為主流趨勢,而高性能的電機控制算法多數是通過主控晶片實現的,隨著高速度、多功能的數位訊號處理器(DSP)的出現,使得更複雜的電機控制策略得以實現。本文以TMS320F28335為主控晶片、IRF530為驅動晶片、IR2110為驅動控制晶片對直流電機進行了H橋驅動控制設計,該控制達到了很好的效果,具有較高使用價值。
  • Arduino用PID控制直流電機定位旋轉 - 【單片機教程-Arduino-PID】
    合作或投稿請發郵件到:rebaby@qq.com在這篇文章中,我們將看到如何實現直流電機的非常精確的位置控制。我們使用Arduino和PID計算來實現簡單直流電機的精確位置控制。這樣的小項目非常有趣,您可以通過構建該項目來學習許多概念,例如PID,閉環系統和編碼器基礎。首先,我想向您簡要介紹什麼是PID,因為這將幫助您進一步了解這些內容。
  • 如何使用樹莓派控制直流電機
    通過使用Raspberry Pi成功控制直流電機,我們可以將它用於各種其他應用,如機器人,遙控(RC)汽車,風扇和其他相關的電機這個項目的目的是將電機安全地連接到Raspberry Pi並控制它,即使其向前或向後旋轉。 注意 :我將在這個項目中使用電機驅動器,最多可以處理兩個電機。因此,可以單獨控制兩臺電機。
  • 基於ARM的步進電機控制系統
    傳統的工業控制大多數是採用8位單片機為控制內核,其價格便宜、設計簡單,容易滿足一般控制要求,但是該單片機存儲空間小,外設資源較少,往往需要與PC機聯合控制才能實現,這樣帶來的問題是實時性較差,人機互動較為複雜,操作麻煩等問題。採用功能較為強大的32位ARM為控制核心,把電源、電機控制板、步進電機和人機界面集成一體將形成一個更為強大的嵌入式一體化控制系統。
  • 基於VHDL的直流電機控制功能模塊設計
    本文利用ALTERA公司最新開發的SOPC解決方案,提出了基於NiosII軟核處理器的直流電機功能模塊的設計方案,給出了VHDL代碼生成功能模塊IP核。IP核的生成,不僅方便設計者靈活使用,節省資源,也大大縮短了設計周期。設計者可以根據需要直接調用IP核來組成NiosII系統,然後將此系統下載到FPGA中實現。
  • 技術文章:STM32F0單片機 PWM + ADC 控制有刷電機
    1.有刷電機驅動電路有刷電機是電機裡面最簡單,也是歷史最悠久的一種,到現在仍然廣泛應用於各個領域。他的控制很簡單,在電機的兩個電極加正向電壓,則正向旋轉,如果加反向電壓,則旋轉方向也反過來。電機的轉速可以通過控制加在電極上的電壓來調節。在電機控制電路中最常用的器件就是 MOS 管了。
  • 基於LIN總線的車用無刷直流電機控制器設計
    由於無刷直流電機擁有良好的調速性能,所以空調系統中一些執行從節點把它作為驅動部件,如壓縮機、鼓風機、冷卻風扇等。這些從節點分別和主節點之間構成了基於LIN總線的無刷直流電機速度閉環控制,主節點通過決策算法給定電機轉速,轉速的反饋和控制算法由從節點來完成,從節點即是作者所要設計的控制器。
  • 怎樣用樹莓派控制直流電機的方向和速度
    使用RPi控制直流電機 我們的下一個任務是使用樹莓派上的python腳本和GPIO頭控制直流電動機,這將在我們的腦海中產生一幅「機器人如何工作」的圖景。您可以根據外面的天氣來控制房間的風扇(因為您知道rpi會使用傳感器)。完成所有這些操作將使您了解機器人技術的基本規則。 我們將控制一個直流電動機,該電動機至少需要400mA的電流才能正常工作,但我們的RPi只能提供接近20mA的電流。這意味著我們必須在外部連接直流電源。這不成問題!我們在市場上有6V和9V的小型電池。
  • 減速電機可以降低直流電機的轉速,舵機也可以,兩者的區別有哪些
    微型電機在一些產品應用中,如需要低轉速、大扭力的參數就會需要用到齒輪減速機,齒輪減速機有行星減速機等結構,舵機也可以實現減速效果,那麼微型減速電機和舵機都是減速傳動設備,為何不只用減速電機就可以了呢?下面天孚微電機來為大家講解,微型減速電機與舵機之間的區別。
  • 基於FPGA的多通道直流電機控制器設計
    採用Verilog HDL語言實現完成了對多通道直流電機的控制。通過Quartus II自帶仿真功能對系統進行時序仿真表明系統結構簡單,且具有良好的功能擴展性。關鍵詞:FPGA;PWM;多通道;並行 機電一體化系統中常需要產生多通道PWM信號以完成對多臺電機進行協調控制,而傳統控制系統仍然採用單片機內部的定時/計數器來產生所需要的PWM信號,但由於定時/計數器及IO埠數量的限制,單個單片機控制器常不能滿足多通道電機並行控制的要求。
  • 基於STM32F4單片機對步進電機的控制
    步進電機簡介步進電機是將電脈衝控制信號轉變為角位移或線位移的一種常用的數字控制執行元件,又稱為脈衝電機。在驅動電源的作用下,步進電機受到脈衝的控制,其轉子的角位移量和速度嚴格地與輸入脈衝的數量和脈衝頻率成正比。步進電機每接收一個電脈衝,轉子就轉過一個相應的角度(步距角)。
  • 基於PIC24FJ64GA的空間電壓矢量PWM控制方法研究
    PWM控制利用半導體開關器件的導通與關斷把整流後的直流電變成脈衝序列,通過控制脈衝寬度和脈衝列的周期以實現變壓、變頻控制,同時減少輸出電壓電流諧波。早期的SPWM控制主要著眼於使逆變器輸出電壓波形儘量接近於正弦波,希望輸出PWM電壓波形的基波成分儘量的大,諧波成分儘量的小,並沒有考慮到電動機本身旋轉磁場的影響。