欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 52219|回復: 23
收起左側

用51單片機控制步進電機運動詳解

  [復制鏈接]
ID:381462 發表于 2018-7-31 22:19 | 顯示全部樓層 |閱讀模式
本來接觸單片機挺久了的,但是一直只是停留在非常初級的認識階段,本科的時候上過幾門課,但是從來沒有自己搗鼓過單片機,這次突然來了興趣,感覺一下子學到了好多東西,在這里好好整理一下。這篇文章只適合于入門階段的小白閱讀,高手請繞道。
12年年初的時候購買了一套普中科技的“單片機開發試驗儀”,好多次想好好學學,結果每一次都半途而廢,主要原因還是周圍的人都不會用,有問題都不知道找誰問,結果鎖到箱子里一直到現在。因為最近需要用到一個步進電機,而這個步進電機需要用PWM波控制。以前也用過電機,直流無刷的、交流伺服等等,但是都是RS232、RS485或者Can總線協議,從來沒有用PWM波控制過。廢話不多說,直接入正題。
硬件單片機型號:STC90C516RD+
步進電機型號:39HS4012A4 1.8° 1.2A
1.jpg
步進電機驅動器型號:M415B 1.5A
2.jpg
代碼源代碼
  1. #include <reg52.h>

  2. unsigned char timer1;
  3. sbit DIR=P1^0; //位定義DIR為P1.0口
  4. sbit ENA=P1^1; //位定義ENA為P1.1口
  5. sbit PWM=P1^2; //位定義PWM為P1.2口

  6. void system_Ini()
  7. {
  8.     TMOD|= 0x11;
  9.     TH1 = 0xfe; //11.0592MHz 0.5ms定時
  10.     TL1 = 0x33;
  11.     TR1 = 1; //啟動T1定時
  12.     IE =0x8A; //開T0,T1中斷,開總中斷
  13. }

  14. main()
  15. {
  16.     system_Ini(); //調用子函數,初始化定時器T1
  17.     while(1)
  18.     {
  19.         if(timer1>100)
  20.         {
  21.             timer1=0; //輸出占空比0.7的PWM脈沖
  22.         }
  23.         if(timer1<30)
  24.         {
  25.             PWM=0;
  26.         }
  27.         else
  28.         {
  29.             PWM=1;
  30.         }
  31.     }
  32. }

  33. /*************************************
  34. [ t1 (0.5ms)中斷] 中斷中做 PWM 輸出
  35. ------------1000/(0.02ms*250)=200Hz
  36. *************************************/
  37. void T1zd(void) interrupt 3 //3 為定時器1的中斷號 1 定時器0的中斷號 0 外部中斷1 2 外部中斷2 4 串口中斷
  38. {
  39.     TH1 = 0xfe; //11.0592 初始化定時器
  40.     TL1 = 0x33;
  41.     timer1++; //計數+1
  42. }
復制代碼
  1. #include <reg52.h> //包含了單片機系統的頭文件
  2. unsigned char timer1; //定義一個無符號字符常量timer1,用來給定時器計數用

  3. sbit DIR=P1^0; //位定義DIR為P1.0口,用來控制步進電機的方向
  4. sbit ENA=P1^1; //位定義ENA為P1.1口,用來控制步進電機的使能
  5. sbit PWM=P1^2; //位定義PWM為P1.1口,用來輸出PWM波

  6. TMOD = 0x11;
  7. //這一句代碼比較費解,因為對單片機的控制字不熟悉,仔細翻看了單片機的手冊,原來這是控制定時器的,共有兩位,前一位控制定時器1,后一位控制定時器0。因為控制只使用了一個定時器1,所以其實定時器0所在的位其實無關緊要?刂莆坏亩x如下圖所示,共4位,組成一個16進制數,所以代碼中的1其實鋪開了二進制應該是0001,對應下面的16位定時器,TL1、TH1全用。
復制代碼

3.jpg
TH1 = 0xfe; //11.0592MHz 0.5ms定時
TL1 = 0x33;
//這句代碼非常的費解,剛開始的時候完全不懂這兩個數索要表示的意思是什么,旁邊還有個注釋,也是沒看懂。好在實驗室有一位大神,分分鐘幫我講懂了。先看芯片手冊上給出的例子:

1.jpg 2.jpg 0.png

  1. //也就是說實際的定時器定時464.6ms,這里終于解釋清楚了為什么上面的定時器數據應該那么寫


  2. TR1 = 1; //啟動T1定時,這里比較好理解

  3. IE =0x8A; //開T0,T1中斷,開總中斷
  4. //這里繼續翻出芯片的技術手冊來解釋,有了前面的基礎,后面看起來自然一目了然,必須允許定時器溢出中斷,定時器每溢出一次就產生一次中斷,總中斷是必須打開的,用了定時器1,因此定時器1的中斷也需要打開,而定時器0的中斷其實開不開無所謂的,因為根本就沒有用定時器0。
復制代碼

1.jpg

  1. main()
  2. {
  3.     system_Ini(); //調用子函數,初始化定時器T1
  4.     while(1) //無限循環
  5.     {
  6.         if(timer1>100)
  7.         {
  8.             timer1=0; //輸出占空比0.7的PWM脈沖
  9.         }
  10.         if(timer1<30)
  11.         {
  12.             PWM=0;
  13.         }
  14.         else
  15.         {
  16.             PWM=1;
  17.         }
  18.     }
  19. }


  20. /*************************************
  21. [ t1 (0.5ms)中斷] 中斷中做 PWM 輸出 1000/(0.02ms*250)=200Hz
  22. *************************************/

  23. void T1zd(void) interrupt 3 //3為定時器1的中斷號; 1為定時器0的中斷號; 0為外部中斷1的中斷號; 2為外部中斷2的中斷號; 4為串口中斷的中斷號,這是芯片規定的

  24. {
  25.     TH1 = 0xfe; //11.0592 初始化定時器,讓定時器復位繼續定時
  26.     TL1 = 0x33;
  27.     timer1++; //計數+1
  28. }
復制代碼


回復

使用道具 舉報

ID:162757 發表于 2018-12-25 21:04 | 顯示全部樓層
真厲害  我學了 10年了 沒學會
回復

使用道具 舉報

ID:451441 發表于 2018-12-26 08:20 | 顯示全部樓層
正好學學東西,在工作中再找機會實踐下
回復

使用道具 舉報

ID:162757 發表于 2018-12-26 19:16 | 顯示全部樓層
昨天來過 樓主說的對 不練不行呀 我英語不好 不會語言
回復

使用道具 舉報

ID:440142 發表于 2019-1-4 09:03 | 顯示全部樓層
timer1=0是怎么實現占空比為0.7的PWM脈沖的呢?
回復

使用道具 舉報

ID:440142 發表于 2019-1-4 09:06 | 顯示全部樓層
關于占空比的問題我明白了,謝謝資料分享!
回復

使用道具 舉報

ID:283906 發表于 2019-3-8 20:33 | 顯示全部樓層
頻率為什么是200hz???0.5ms中斷一次timer1++,timer計100次,0.5*100==50ms,1/50==20hz?頻率是怎么算的啊
回復

使用道具 舉報

ID:483402 發表于 2019-3-20 00:24 | 顯示全部樓層

timer1=0是怎么實現占空比為0.7的PWM脈沖的呢?
下面的語句 指示標注錯地方了
        if(timer1<30)
        {
            PWM=0;
        }
        else
        {
            PWM=1;
頻率為什么是200hz???0.5ms中斷一次timer1++,timer計100次,0.5*100==50ms,1/50==20hz?頻率是怎么算的啊  
同問 我也想知道 這數是怎么算出來的還是寫錯了
回復

使用道具 舉報

ID:483402 發表于 2019-3-20 00:24 | 顯示全部樓層
不能發帖嗎
回復

使用道具 舉報

ID:538990 發表于 2019-5-15 16:06 | 顯示全部樓層
有用單片機開發控制器的嗎?  就是單片機系統直接驅動步進電機,  省去了步進電機控制器。,求高手賜教
回復

使用道具 舉報

ID:540088 發表于 2019-5-16 18:20 | 顯示全部樓層
樓主 能給個聯系方式嗎  我用單片機控制28byj-4電機,但是程序一直出錯,能不能幫我看看是什么情況?單片機也是用的STC90C516RD+
回復

使用道具 舉報

ID:582255 發表于 2019-8-13 16:44 | 顯示全部樓層
up主可以分享一下不?56003418@qq.com
回復

使用道具 舉報

ID:564157 發表于 2019-12-11 18:42 | 顯示全部樓層
無常 發表于 2019-3-8 20:33
頻率為什么是200hz???0.5ms中斷一次timer1++,timer計100次,0.5*100==50ms,1/50==20hz啊?頻率是怎么 ...

可以用軟件算 有一個軟件可以算
回復

使用道具 舉報

ID:298008 發表于 2020-1-6 23:24 | 顯示全部樓層
謝謝樓主分享!!
回復

使用道具 舉報

ID:140644 發表于 2020-1-7 10:23 | 顯示全部樓層
普中也就51搞搞,STM32服務都沒有,搞個BBS癱瘓的,回復一直要劃圖像還發不出,普中最垃圾了。
回復

使用道具 舉報

ID:298008 發表于 2020-2-22 10:13 | 顯示全部樓層
謝謝樓主分享。!
回復

使用道具 舉報

ID:710053 發表于 2020-3-17 17:57 | 顯示全部樓層
謝謝樓主分享
回復

使用道具 舉報

ID:695749 發表于 2020-3-17 22:23 | 顯示全部樓層
認真學習,努力思考,謝謝分享!
回復

使用道具 舉報

ID:707309 發表于 2020-3-18 15:42 | 顯示全部樓層
有沒有帶加減速的例子,謝謝分享
回復

使用道具 舉報

ID:695749 發表于 2020-3-18 21:21 | 顯示全部樓層
“3為定時器1的中斷號; 1為定時器0的中斷號; 0為外部中斷1的中斷號; 2為外部中斷2的中斷號; 4為串口中斷的中斷號,這是芯片規定的”
明白了一些,主要在實踐,謝謝分享!
回復

使用道具 舉報

ID:727456 發表于 2020-4-26 08:45 | 顯示全部樓層
厲害,確實清楚
回復

使用道具 舉報

ID:282095 發表于 2020-5-13 22:53 | 顯示全部樓層
樓上思路清晰,蠻值得學習的。
回復

使用道具 舉報

ID:748312 發表于 2020-5-18 16:20 | 顯示全部樓層
這個詳細適合我學習,謝謝
回復

使用道具 舉報

ID:732581 發表于 2020-5-18 21:24 來自觸屏版 | 顯示全部樓層
不錯不錯
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表