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

標題: 萌新求教一個關于DA轉換(PWM)的問題,求指點 [打印本頁]

作者: 明日香    時間: 2020-7-29 09:54
標題: 萌新求教一個關于DA轉換(PWM)的問題,求指點
本帖最后由 明日香 于 2020-7-29 10:05 編輯

實驗現象是DA模塊上的小燈成呼吸效果,由亮變暗
這是完整的程序:

請問,這個程序里value是代表一個周期里的高電平,那count的作用是什么呢?為什么要判斷count大于100?count每次加1的時間應該是1us吧,count加到100再清零是只為了產生100us的間隔嗎?
timer1代表一個周期1ms,它肯定大于等于value吧,為什么要判斷它小于value呢?
還有這個程序,value==1000則DIR=0,value==0則DIR=1,那value處于1000和0之間怎么辦?
以及,這個PWM的周期timer1為什么是1000us,這個周期是自己設定的嗎?



作者: lxbhcy    時間: 2020-7-29 11:07
value表示高電平的時間,count的作用就是100us使其變化一次,判斷value和timer的大小關系,只能為了決定PWM端口的電平,,可以改周期
作者: 1692483014    時間: 2020-7-29 13:59
上面這段代碼的功能雖然實現了,但是命名真的很不規范,不易讀懂,好在是我讀懂了。

經過分析:各個參數的含義如下:
1. timer1:PWM的周期,為1ms;
2. DIR :呼吸燈的變化方向,如果從硬件上來說,燈是用高電平1點亮的話,那么DIR=1代表呼吸燈越來越亮,DIR=0則是變暗;反之亦然;
3. value:用于控制單個周期內高電平的持續時間。它只能設置成小于或者等于周期時間;它為0,則本周期高電平持續時間為0,占空比為0%,它為1000時,則高電平持續在整個周期內,則占空比為100%。中間的值則介于這兩者之間,占空比計算:(value/10)%,具體為什么除以10,請看下面的count的介紹。
4. count :用于指定相鄰兩個周期的波形中高電平的增加量,或者叫相鄰兩周期波形占空比的增加量;判斷count大于100指的是相鄰兩個周期的波形的增加量為:周期/100 = timer1/100 = 10us. 所以相鄰兩個周期的占空比變化為10us/1000us = 1%;

通過上面的分析,我們知道輸出各個周期的波形的占空比依次為:
0%,1%,2%,3%,...  ,99%,100%,99%,98%,...,2%,1%
按照上面的變化規律反復進行,就形成呼吸燈了。
其中0%到100%是逐漸變亮,而100%到0%則是逐漸變暗。
由于一個波形的周期是1ms,那么一個呼吸周期就是200ms。
作者: 明日香    時間: 2020-7-30 09:46
1692483014 發表于 2020-7-29 13:59
上面這段代碼的功能雖然實現了,但是命名真的很不規范,不易讀懂,好在是我讀懂了。

經過分析:各個參數 ...

請問為什么一個周期是1ms?這個是自己設定的嗎?還是固定的?
作者: 979856362dlut    時間: 2020-7-30 10:42
這個程序三個關鍵變量:1.timer1是PWM周期,周期為1000*1us,因為定時中斷實現的是1us定時,每次timer1++,然后主程序82行判斷是否到達1000,如果到達則完成定時1000*1us,此時要重新清零timer1,同時在這里86行控制引腳PWM=P2.1輸出正負電平。2:value確實是控制占空比的變量,正如你所說的現象是呼吸燈,那么這個占空比就不是定值了,需要程序設計占空比的更改,既要有占空比大小的更改,即value值要變化,同時也有方向的控制,即一會兒占空比變大,一會兒變小,用DIR正負來控制增減。3:count是控制value變化速度的,假如我們把value的增減周期和PWM的周期都設置成1000*1us,這個時候呼吸燈就會變化得相對很慢,試想一下每次PWM周期到了,value占空比僅僅增加或者減小1就很不明顯了。所以count就是把value更改的時間縮短了,換言之,這樣每次PWM周期到了,value占空比更改的數值+/- 10,這樣呼吸燈的效果也好看
作者: 979856362dlut    時間: 2020-7-30 10:45
明日香 發表于 2020-7-30 09:46
請問為什么一個周期是1ms?這個是自己設定的嗎?還是固定的?

這個周期是靈活規定的,200ms我覺得也可以,更改timer1判斷的值就好(82行)
作者: 1692483014    時間: 2020-8-1 02:26
明日香 發表于 2020-7-30 09:46
請問為什么一個周期是1ms?這個是自己設定的嗎?還是固定的?

是你的代碼里if(timer1>1000)那句話看出來,timer1是每1000us從0重新開始,說明就是1ms,這個1ms的周期你可以自己改,但是要注意其他值也要跟著相應調整才行,看懂我上面寫的原理,你就知道咋調試了,你試著自己改一下參數,讓燈呼吸的過程更加緩慢,來驗證你的推斷。
作者: wulin    時間: 2020-8-1 09:28
樓主這個程序有嚴重錯誤,定時中斷周期1us,執行中斷函數4條指令需要8us時間,就算能勉強運行,根本就不是預期結果。代碼改這樣既容易理解也能實戰。
  1. #include "reg52.h"

  2. typedef unsigned int u16;
  3. typedef unsigned char u8;

  4. sbit PWM=P2^1;

  5. bit  DIR;
  6. u16  count;
  7. u8   value=0;


  8. void Timer1Init()
  9. {
  10.         TMOD|=0X20;//自動重裝
  11.         TH1 = 0x38;//200us
  12.         TL1 = 0x38;
  13.         ET1 = 1;
  14.         EA  = 1;
  15.         TR1 = 1;
  16. }

  17. void main()
  18. {        
  19.         Timer1Init();
  20.         while(1);               
  21. }

  22. void Timer1() interrupt 3
  23. {
  24.         count++;
  25.         if(count==100)
  26.         {
  27.                 count=0;
  28.                 if(DIR)
  29.                 {
  30.                         value++;
  31.                         if(value==100)
  32.                         {
  33.                                 DIR=0;
  34.                         }
  35.                 }
  36.                 else
  37.                 {
  38.                         value--;
  39.                         if(value==0)
  40.                         {
  41.                                 DIR=1;
  42.                         }
  43.                 }
  44.         }
  45.         if(count>=value)
  46.         {
  47.                 PWM=1;
  48.         }
  49.         else
  50.         {
  51.                 PWM=0;
  52.         }
  53. }
復制代碼

作者: scmswxiloveyou    時間: 2020-8-1 11:07
單片機中確實要注意指令執行周期,保證需求要求的時序




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1