亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 6900|回復(fù): 5
打印 上一主題 下一主題
收起左側(cè)

單片機(jī)PWM+紅外對(duì)管控制直流電機(jī)設(shè)計(jì)源碼

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
設(shè)計(jì)中采用了專門的芯片組成了PWM信號(hào)的發(fā)生系統(tǒng)并且對(duì)PWM信號(hào)的原理、產(chǎn)生方法以及如何通過(guò)軟件編程對(duì)PWM信號(hào)占空比進(jìn)行調(diào)節(jié)從而控制其輸入信號(hào)波形等均作了詳細(xì)的闡述。另外本系統(tǒng)中使用了紅外對(duì)管對(duì)直流電機(jī)的轉(zhuǎn)速進(jìn)行測(cè)量,經(jīng)過(guò)整形電路后將測(cè)量值送到單片機(jī),并且最終作為反饋值輸入到單片機(jī)進(jìn)行PID運(yùn)算從而實(shí)現(xiàn)了對(duì)直流電機(jī)速度的控制。在軟件方面,文章中詳細(xì)介紹了PID運(yùn)算程序初始化程序等的編寫思路和具體的程序?qū)崿F(xiàn)。

1 單片機(jī)最小系統(tǒng):單片機(jī)最小系統(tǒng)由51單片機(jī),晶振電路,復(fù)位電路,電源組成。大家都比較熟悉,這里不再贅述。
2 四位數(shù)碼管顯示:在應(yīng)用系統(tǒng)中,設(shè)計(jì)要求不同,使用的LED顯示器的位數(shù)也不同,因此就生產(chǎn)了位數(shù),尺寸,型號(hào)不同的LED顯示器供選擇,在本設(shè)計(jì)中,選擇4位一體的數(shù)碼型LED顯示器,簡(jiǎn)稱“4-LED”。本系統(tǒng)中前三位顯示電壓的整數(shù)位,最后一位顯示轉(zhuǎn)速的小數(shù)位。4-LED顯示器引腳如圖2所示,是一個(gè)共陰極接法的4位LED數(shù)碼顯示管,其中a,b,c,e,f,g為4位LED各段的公共輸出端,1、2、3、4分別是每一位的位數(shù)選端,dp是小數(shù)點(diǎn)引出端,4位一體LED數(shù)碼顯示管的內(nèi)部結(jié)構(gòu)是由4個(gè)單獨(dú)的LED組成,每個(gè)LED的段輸出引腳在內(nèi)部都并聯(lián)后,引出到器件的外部。
3 電機(jī)驅(qū)動(dòng)電路:電機(jī)驅(qū)動(dòng)電中是采用ULN2003來(lái)驅(qū)動(dòng)。ULN2003是高耐壓、大電流達(dá)林頓陳列,由七個(gè)硅NPN達(dá)林頓管組成。該電路的特點(diǎn):ULN2003的每一對(duì)達(dá)林頓都串聯(lián)一個(gè)2.7K的基極電阻,在5V的工作電壓下它能與TTL和CMOS電路直接相連,可以直接處理原先需要標(biāo)準(zhǔn)邏輯緩沖器來(lái)處理的數(shù)據(jù),輸入5VTTL電平,輸出可達(dá)500mA/50V。ULN2003的引腳圖,其中IN1~IN7為輸入控制端;OUT1~OUT7為輸出端;8腳為芯片的接地端;9腳為公共端,該腳是內(nèi)部7個(gè)續(xù)流二極管負(fù)極的公共端,各二極管的正極分別接各達(dá)林頓管的集電極。用于感性負(fù)載時(shí),該腳接負(fù)載電源正極,實(shí)現(xiàn)續(xù)流作用。如果該腳接地,實(shí)際上就是達(dá)林頓管的集電極對(duì)地接通。
當(dāng)P1.0中為高電平時(shí),其內(nèi)部三極管導(dǎo)通,使電機(jī)轉(zhuǎn)動(dòng)。當(dāng)P1.0為低電平時(shí),內(nèi)部三極管截止,電路斷開(kāi),電機(jī)停止轉(zhuǎn)動(dòng)。所以在程序中可以利用P1.0口輸出PWM波來(lái)控制電機(jī)的轉(zhuǎn)速。
4 紅外測(cè)速電路:發(fā)射管工作時(shí)發(fā)出紅外線,當(dāng)接收管收到紅外信號(hào)時(shí),其電阻變。ū驹O(shè)計(jì)相當(dāng)于從無(wú)窮大變到1k左右)。利用其電阻變化,改變接收管分壓情況。擋片是利用圓盤上剪四個(gè)孔,當(dāng)擋片隨電機(jī)轉(zhuǎn)動(dòng)時(shí),接收管兩端電平發(fā)生變化,產(chǎn)生脈沖。
5 整形電路:本設(shè)計(jì)的整形電路是用555定時(shí)器接成的施密特觸發(fā)器。

6 源程序:
  1. #include "reg52.h"
  2. #define uchar unsigned char
  3. #define uint unsigned int
  4. uchar code table[10]={0x3f,0x06,0x5b,
  5. 0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共陰數(shù)碼管顯示碼(0-9)
  6. sbit xiaoshudian=P0^7;
  7. sbit wei1=P2^4; //數(shù)碼管位選定義
  8. sbit wei2=P2^5;
  9. sbit wei3=P2^6;
  10. sbit wei4=P2^7;
  11. sbit beep=P2^3; //蜂鳴器控制端
  12. sbit motor = P1^0; //電機(jī)控制
  13. sbit s1_jiasu = P1^4; //加速按鍵
  14. sbit s2_jiansu= P1^5; //減速按鍵
  15. sbit s3_jiting=P1^6; //停止/開(kāi)始按鍵
  16. uint pulse_count; //INT0接收到的脈沖數(shù)
  17. uint num=0; //num相當(dāng)于占空比調(diào)節(jié)的精度
  18. uchar speed[3]; //四位速度值存儲(chǔ)
  19. float bianhuasudu; //當(dāng)前速度(理論計(jì)算值)
  20. float reallyspeed; //實(shí)際測(cè)得的速度
  21. float vv_min=0.0;vv_max=250.0;
  22. float vi_Ref=60.0; //給定值
  23. float vi_PreError,vi_PreDerror;
  24. uint pwm=100; //相當(dāng)于占空比標(biāo)志變量
  25. int sample_time=0; //采樣標(biāo)志
  26. float v_kp=1.2,v_ki=0.6,v_kd=0.2; //比例,積分,微分常數(shù)
  27. void delay (uint z)
  28. {
  29. uint x,y;
  30. for(x=z;x>0;x--)
  31. for (y=20;y>0;y--);
  32. }
  33. void time_init()
  34. {
  35. ET1=1; //允許定時(shí)器T1中斷
  36. ET0=1; //允許定時(shí)器T0中斷
  37. TMOD = 0x15; //定時(shí)器0計(jì)數(shù),模式1;定時(shí)器1定時(shí),模式1
  38. TH1 = (65536-100)/256; //定時(shí)器1值,負(fù)責(zé)PID中斷 ,0.1ms定時(shí)
  39. TL1 = (65536-100)%6;
  40. TR0 = 1; //開(kāi)定時(shí)器
  41. TR1 = 1;
  42. IP=0X08; //定時(shí)器1為高優(yōu)級(jí)
  43. EA=1; //開(kāi)總中斷
  44. }
  45. void keyscan()
  46. {
  47. float j;
  48. if(s1_jiasu==0) //加速
  49. {
  50. delay(20);
  51. if(s1_jiasu==0)
  52. vi_Ref+=10;
  53. j=vi_Ref;
  54. }
  55. while(s1_jiasu==0);
  56. if(s2_jiansu==0) //減速
  57. {
  58. delay(20);
  59. if(s2_jiansu==0)
  60. vi_Ref-=10;
  61. j=vi_Ref;
  62. }
  63. while(s2_jiansu==0);
  64. if(s3_jiting==0)
  65. {
  66. delay(20);
  67. motor=0;
  68. P1=0X00;
  69. P3=0X00;
  70. P0=0x00;
  71. }
  72. while(s3_jiting==0);
  73. }
  74. float v_PIDCalc(float vi_Ref,floatvi_SpeedBack)
  75. {
  76. register floaterror1,d_error,dd_error;
  77. error1=vi_Ref-vi_SpeedBack; //偏差的計(jì)算
  78. d_error=error1-vi_PreError; //誤差的偏差
  79. dd_error=d_error-vi_PreDerror; //誤差變化率
  80. vi_PreError=error1; //存儲(chǔ)當(dāng)前偏差
  81. vi_PreDerror=d_error;
  82. bianhuasudu=(v_kp*d_error+v_ki*vi_PreError+v_kd*dd_error);
  83. return (bianhuasudu);
  84. }
  85. void v_Display()
  86. {
  87. uint sudu;
  88. sudu=(int)(reallyspeed*10); //乘以10之后強(qiáng)制轉(zhuǎn)化成整型
  89. speed[3]=sudu/1000; //百位
  90. speed[2]=(sudu00)/100; //十位
  91. speed[1]=(sudu0)/10; //個(gè)位
  92. speed[0]=sudu; //小數(shù)點(diǎn)后一位
  93. wei1=0; //第一位打開(kāi)
  94. P0=table[speed[3]];
  95. delay(5);
  96. wei1=1; //第一位關(guān)閉
  97. wei2=0;
  98. P0=table[speed[2]];
  99. delay(5);
  100. wei2=1;
  101. wei3=0;
  102. P0=table[speed[1]];
  103. xiaoshudian=1;
  104. delay(5);
  105. wei3=1;
  106. wei4=0;
  107. P0=table[speed[0]];
  108. delay(5);
  109. wei4=1;
  110. }
  111. void BEEP()
  112. {
  113. if((reallyspeed)>=vi_Ref+5||(reallyspeed
  114. {
  115. beep=~beep;
  116. delay(4);
  117. }
  118. }
  119. void main()
  120. {
  121. time_init();
  122. motor=0;
  123. while(1)
  124. {
  125. v_Display();
  126. BEEP();
  127. }
  128. if(s3_jiting==0) //對(duì)按鍵3進(jìn)行掃描,增強(qiáng)急停效果
  129. {
  130. delay(20);
  131. motor=0;
  132. P1=0X00;
  133. P3=0X00;
  134. P0=0x00;
  135. }
  136. while(s3_jiting==0);
  137. }
  138. void timer0() interrupt 1
  139. {
  140. }
  141. void timer1() interrupt 3
  142. {
  143. TH1 = (65536-100)/256; //1ms定時(shí)
  144. TL1 = (65536-100)%6;
  145. sample_time++;
  146. if(sample_time==5000) //采樣時(shí)間0.1ms*5000=0.5s
  147. {
  148. TR0=0; //關(guān)閉定時(shí)器0
  149. sample_time=0;
  150. pulse_count=TH0*255+TL0; //保存當(dāng)前脈沖數(shù)
  151. keyscan(); //掃描按鍵
  152. reallyspeed=pulse_count/(4*0.6); //計(jì)算速度
  153. pwm=pwm+v_PIDCalc(vi_Ref,reallyspeed);
  154. if(pwm
  155. if(pwm>100)pwm=100;
  156. TH0=TL0=0;
  157. TR0=1; //開(kāi)啟定時(shí)器0
  158. }
  159. num++;
  160. if(num==pwm) //此處的num值,就是占空比
  161. {
  162. motor=0;
  163. }
  164. if(num==100) //100相當(dāng)于占空比調(diào)節(jié)的精度
  165. {
  166. num=0;
  167. motor=1;
  168. }
  169. }
復(fù)制代碼


分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏4 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:249808 發(fā)表于 2018-4-23 14:53 | 只看該作者
謝謝分享……
回復(fù)

使用道具 舉報(bào)

板凳
ID:435423 發(fā)表于 2020-1-13 13:00 來(lái)自觸屏版 | 只看該作者
reallyspeed=pulse_count/(4*0.6); //計(jì)算速度
回復(fù)

使用道具 舉報(bào)

地板
ID:435423 發(fā)表于 2020-1-13 13:01 來(lái)自觸屏版 | 只看該作者
reallyspeed=pulse_count/(4*0.6); //計(jì)算速度     這里的0.6是秒數(shù)嗎,采樣時(shí)間是0.5s,為什么不是0.5呢?
回復(fù)

使用道具 舉報(bào)

5#
ID:375228 發(fā)表于 2020-1-29 22:07 | 只看該作者
謝謝分享,很好的學(xué)習(xí)資料
回復(fù)

使用道具 舉報(bào)

6#
ID:726416 發(fā)表于 2020-6-22 15:27 | 只看該作者
q786299029 發(fā)表于 2020-1-13 13:01
reallyspeed=pulse_count/(4*0.6); //計(jì)算速度     這里的0.6是秒數(shù)嗎,采樣時(shí)間是0.5s,為什么不是0.5呢?

復(fù)制人家的,哪里能解釋
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表