91在线观看视频-91在线观看视频-91在线观看免费视频-91在线观看免费-欧美第二页-欧美第1页

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

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

3天內不再提示

PID運算程序和初始化程序的實現

GReq_mcu168 ? 來源:搜狐網 ? 作者:搜狐網 ? 2020-10-09 12:01 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

設計中采用了專門的芯片組成了PWM信號的發生系統并且對PWM信號的原理、產生方法以及如何通過軟件編程對PWM信號占空比進行調節從而控制其輸入信號波形等均作了詳細的闡述。另外本系統中使用了紅外對管對直流電機的轉速進行測量,經過整形電路后將測量值送到單片機,并且最終作為反饋值輸入到單片機進行PID運算從而實現了對直流電機速度的控制。在軟件方面,文章中詳細介紹了PID運算程序初始化程序等的編寫思路和具體的程序實現。

1 單片機最小系統:單片機最小系統由51單片機,晶振電路,復位電路,電源組成。大家都比較熟悉,這里不再贅述。

2 四位數碼管顯示:在應用系統中,設計要求不同,使用的LED顯示器的位數也不同,因此就生產了位數,尺寸,型號不同的LED顯示器供選擇,在本設計中,選擇4位一體的數碼型LED顯示器,簡稱“4-LED”。本系統中前三位顯示電壓的整數位,最后一位顯示轉速的小數位。4-LED顯示器引腳如圖2所示,是一個共陰極接法的4位LED數碼顯示管,其中a,b,c,e,f,g為4位LED各段的公共輸出端,1、2、3、4分別是每一位的位數選端,dp是小數點引出端,4位一體LED數碼顯示管的內部結構是由4個單獨的LED組成,每個LED的段輸出引腳在內部都并聯后,引出到器件的外部。

3 電機驅動電路:電機驅動電中是采用ULN2003來驅動。ULN2003是高耐壓、大電流達林頓陳列,由七個硅NPN達林頓管組成。該電路的特點:ULN2003的每一對達林頓都串聯一個2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路直接相連,可以直接處理原先需要標準邏輯緩沖器來處理的數據,輸入5VTTL電平,輸出可達500mA/50V。ULN2003的引腳圖,其中IN1~IN7為輸入控制端;OUT1~OUT7為輸出端;8腳為芯片的接地端;9腳為公共端,該腳是內部7個續流二極管負極的公共端,各二極管的正極分別接各達林頓管的集電極。用于感性負載時,該腳接負載電源正極,實現續流作用。如果該腳接地,實際上就是達林頓管的集電極對地接通。

當P1.0中為高電平時,其內部三極管導通,使電機轉動。當P1.0為低電平時,內部三極管截止,電路斷開,電機停止轉動。所以在程序中可以利用P1.0口輸出PWM波來控制電機的轉速。

4 紅外測速電路:發射管工作時發出紅外線,當接收管收到紅外信號時,其電阻變小(本設計相當于從無窮大變到1k左右)。利用其電阻變化,改變接收管分壓情況。擋片是利用圓盤上剪四個孔,當擋片隨電機轉動時,接收管兩端電平發生變化,產生脈沖。

5 整形電路:本設計的整形電路是用555定時器接成的施密特觸發器。

6 源程序:

#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;

}

}

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

    關注

    37

    文章

    1482

    瀏覽量

    88112
  • 初始化程序
    +關注

    關注

    1

    文章

    4

    瀏覽量

    6809

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

文章出處:【微信號:mcu168,微信公眾號:硬件攻城獅】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關推薦
    熱點推薦

    定義IO初始化結構體

    由上述IOPORT相關功能的枚舉類型我們可以知道,在對IOPORT模塊進行初始化時需要根據情況配置它們。因此我們定義一個IOPORT初始化的結構體類型IOPORT_Init_t,它的成員包括了由上述所有枚舉類型所聲明的變量,因此該結構體類型的變量可以包含IOPORT的相關
    的頭像 發表于 07-16 16:26 ?570次閱讀

    IM系列設備過載故障:界面初始化終止的診斷流程與修復指南

    當 IM 系列設備出現過載故障導致界面初始化終止時,通常表現為設備啟動后操作界面無顯示、指示燈異常閃爍或初始化進度條停滯不前,同時可能伴隨設備運行異響或異常發熱。初步判斷時,可觀察設備是否有錯
    的頭像 發表于 06-28 09:47 ?421次閱讀

    IM 系列設備過載保護機制下界面初始化中斷的底層邏輯與解決方案

    一、過載保護機制與界面初始化的關聯基礎 IM 系列設備的過載保護機制是保障設備安全運行的核心功能,其通過傳感器實時采集設備運行參數,如電流、電壓、溫度、系統資源占用率等。一旦這些參數超出預設閾值
    的頭像 發表于 06-27 09:58 ?82次閱讀

    請問init_ipc_shm() 是否只初始化一次?

    通過在 S32G A 核上使用 C(或 C)創建多個項目來開發 IPCF 功能時,是init_ipc_shm()允許初始化已配置的共享資源的函數僅一次在運行時?如果是,系統級別的最佳架構建議是什么?我的想法是實現一個自啟動服務程序
    發表于 03-25 08:05

    STM32CubeMX用于STM32配置和初始化C代碼生成

    電子發燒友網站提供《STM32CubeMX用于STM32配置和初始化C代碼生成.pdf》資料免費下載
    發表于 02-26 17:32 ?677次下載

    ads1252的初始化程序是什么?

    我想問下ads1252的初始化程序是什么?我整了半天也沒整明白?有更多關于ads1252的資料嗎
    發表于 02-13 06:45

    EE-359:ADSP-CM40x啟動時間優化和器件初始化

    電子發燒友網站提供《EE-359:ADSP-CM40x啟動時間優化和器件初始化.pdf》資料免費下載
    發表于 01-13 16:33 ?0次下載
    EE-359:ADSP-CM40x啟動時間優化和器件<b class='flag-5'>初始化</b>

    EE-88:使用21xx編譯器在C中初始化變量

    電子發燒友網站提供《EE-88:使用21xx編譯器在C中初始化變量.pdf》資料免費下載
    發表于 01-13 15:54 ?0次下載
    EE-88:使用21xx編譯器在C中<b class='flag-5'>初始化</b>變量

    ADS1259初始化程序必須執行兩次才能夠初始化成功,為什么?

    最近在調試ADS1259這個片子,發現初始化程序必須執行兩次才能夠初始化成功,然后讀出來的CONFIG0寄存器的最高位是“0”(官方文檔上是“1”),不知道是什么原因,求TI工程師解答呀!
    發表于 01-10 12:41

    OMAP5912多媒體處理器初始化參考指南

    電子發燒友網站提供《OMAP5912多媒體處理器初始化參考指南.pdf》資料免費下載
    發表于 12-17 16:20 ?0次下載
    OMAP5912多媒體處理器<b class='flag-5'>初始化</b>參考指南

    STM32F407 MCU使用SD NAND?不斷電初始化失效解決方案

    STM32F407微控制器單元(MCU)與SD NAND的結合提供了強大的存儲解決方案。然而,不斷電初始化失效問題可能會導致系統穩定性和數據完整性受損。我們將STM32F407與SD NAND集成時可能遇到的初始化問題,并提供專業的解決方案。
    的頭像 發表于 12-11 10:51 ?964次閱讀
    STM32F407 MCU使用SD NAND?不斷電<b class='flag-5'>初始化</b>失效解決方案

    基于旋轉平移解耦框架的視覺慣性初始化方法

    精確和魯棒的初始化對于視覺慣性里程計(VIO)至關重要,因為不良的初始化會嚴重降低姿態精度。
    的頭像 發表于 11-01 10:16 ?974次閱讀
    基于旋轉平移解耦框架的視覺慣性<b class='flag-5'>初始化</b>方法

    TMS320C6000 McBSP初始化

    電子發燒友網站提供《TMS320C6000 McBSP初始化.pdf》資料免費下載
    發表于 10-26 10:10 ?1次下載
    TMS320C6000 McBSP<b class='flag-5'>初始化</b>

    視頻引擎初始化失敗怎么回事

    視頻引擎初始化失敗是一個常見的技術問題,它可能由多種原因引起,包括軟件沖突、硬件問題、驅動程序問題、系統設置錯誤等。要解決這個問題,需要對可能的原因進行詳細的分析和診斷。 1. 軟件沖突 1.1
    的頭像 發表于 09-18 18:18 ?2903次閱讀

    linux驅動程序主要有哪些功能

    Linux驅動程序是操作系統與硬件設備之間進行通信的橋梁,負責實現硬件設備與操作系統之間的數據交換和控制。Linux驅動程序的主要功能包括以下幾個方面: 設備識別與初始化 Linux驅
    的頭像 發表于 08-30 14:47 ?911次閱讀
    主站蜘蛛池模板: 欧美在线小视频 | 性生活一区 | 乱码一区二区三区完整视频 | 国外精品视频在线观看免费 | 国产色婷婷精品综合在线观看 | 欧美日韩亚洲国产一区二区综合 | 182福利视频| 额去鲁97在线观看视频 | 147西西人体大胆免费网 | sihu免费观看在线高清 | 亚洲第一网站快活影院 | 亚洲人在线 | 高清人人天天夜夜曰狠狠狠狠 | 色偷偷.com| 亚洲阿v天堂2018在线观看 | 在线天堂中文新版www | 女人扒开腿让男人桶到爽 | 五月天亚洲综合 | 毛片网站免费在线观看 | 日本高清网站 | 特大一级aaaaa毛片 | 日本美女视频网站 | 国产拍拍拍免费视频网站 | 国产色爽女小说免费看 | 日本不卡一区二区三区在线观看 | 波多野结衣在线免费视频 | 成年毛片| 一区二区免费 | 女色窝人体色77777 | 成人免费看黄页网址大全 | 精品欧美一区二区三区 | 国产精品久久新婚兰兰 | 羞羞漫画喷水漫画yy漫画 | 亚州一级毛片 | 亚洲一区二区三区免费看 | 国产成人啪精品午夜在线播放 | 国产精品你懂的在线播放 | 看片在线 | 女人张开腿让男人捅爽 | 91极品女神嫩模在线播放 | 韩日中文字幕 |