[TPYBoard - Micropython之會python就能做硬件 5] 學習使用重力傳感器及PWM


轉載請注明:@小五義 http://www.cnblogs.com/xiaowuyi            歡迎加入討論群 64770604

 

一、實驗器材

1TPYboard V102板  一塊

2LED燈   一個

31602 屏 一塊

 

二、重力傳感器

        TPYboardpyboard一樣,本身帶一個重力傳感器。該傳感器能夠感知到加速的變化加速力就是當物體在加速過程中作用在物體上的力,比如晃動、跌落、上升、下降等各種移動變化都能被轉化為電信號

       TPYBoard使用的是MMA7660重力傳感器,主要用於檢測XYZ三個軸所受到的加速度大小。檢測范圍是-1.5g ~ 1.5g,其中,g為一個重力加速度。

 

 

 

 

 

三、重力傳感器的使用

 這里,我們做一個簡單的實驗,利用重力傳感器,來判斷tpyboard板子的旋轉方向。當tpyboard向右轉動時,亮led2(板載),滅led3,當向左轉動時,亮led3(板載),滅led2

具體代碼如下:

# main.py -- put your code here!
import pyb

accel = pyb.Accel()
while 1:
    x = accel.x()
    y = accel.y()
    z = accel.z()
    print(x,y,z)
    if x==4 :
        pyb.LED(2).off()
        pyb.LED(3).off()
    if x>4 :
        pyb.LED(2).on()
        pyb.LED(3).off()
    if x<4:
        pyb.LED(3).on()
        pyb.LED(2).off()

實現效果:

 

四、利用重力傳感器控制LED亮度

1、什么是PWM

   PWM:脈沖寬度調制是利用微處理器的數字輸出來對模擬電路進行控制的一種非常有效的技術,廣泛應用在從測量、通信到功率控制與變換的許多領域中。PWM基本原理是控制方式就是對逆變電路開關器件的通斷進行控制,使輸出端得到一系列幅值相等的脈沖,用這些脈沖來代替正弦波或所需要的波形。也就是在輸出波形的半個周期中產生多個脈沖,使各脈沖的等值電壓為正弦波形,所獲得的輸出平滑且低次諧波少。按一定的規則對各脈沖的寬度進行調制,即可改變逆變電路輸出電壓的大小,也可改變輸出頻率。

  例如,把正弦半波波形分成N等份,就可把正弦半波看成由N個彼此相連的脈沖所組成的波形。這些脈沖寬度相等,都等於 ∏/n ,但幅值不等,且脈沖頂部不是水平直線,而是曲線,各脈沖的幅值按正弦規律變化。如果把上述脈沖序列用同樣數量的等幅而不等寬的矩形脈沖序列代替,使矩形脈沖的中點和相應正弦等分的中點重合,且使矩形脈沖和相應正弦部分面積(即沖量)相等,就得到一組脈沖序列,這就是PWM波形。可以看出,各脈沖寬度是按正弦規律變化的。根據沖量相等效果相同的原理,PWM波形和正弦半波是等效的。對於正弦的負半周,也可以用同樣的方法得到PWM波形。在PWM波形中,各脈沖的幅值是相等的,要改變等效輸出正弦波的幅值時,只要按同一比例系數改變各脈沖的寬度即可,因此在交-直-交變頻器中,PWM逆變電路輸出的脈沖電壓就是直流側電壓的幅值。根據上述原理,在給出了正弦波頻率,幅值和半個周期內的脈沖數后,PWM波形各脈沖的寬度和間隔就可以准確計算出來。按照計算結果控制電路中各開關器件的通斷,就可以得到所需要的PWM波形。

2、利用PWM調節LED燈亮度

   Tpyboard板子與pyboard是一致的,其pwmTimer的一種工作模式,它需要使用到TimerPin兩個庫。這里來看一下如何控制LED3(板載)的亮度。

代碼:

from pyb import Pin, Timer

tm2=Timer(2, freq=100)
led3=tm2.channel(1, Timer.PWM, pin=Pin.cpu.A15)
led3.pulse_width_percent(10)

此時LED3的亮度較暗,見圖:

將上面代碼中的pulse_width_percent=10改為100,再來看一下效果,會發現LED3亮度明顯增強。

代碼:

from pyb import Pin, Timer

tm2=Timer(2, freq=100)
led3=tm2.channel(1, Timer.PWM, pin=Pin.cpu.A15)
led3.pulse_width_percent(100)

當然,也可以嘗試改一下freq來試試,這樣看是什么 效果?

 

3、micropython的標准庫Timer

 (1)class pyb.Timer(id, ...):創建定時器對象,id范圍是[1..14]

 (2)timer.init(*, freq, prescaler, period):定時器初始化。

 (3)freq:頻率。

 (4)prescaler,預分頻,[0-0xffff],定時器頻率是系統時鍾除以(prescaler + 1)。定時器2-712-14最高頻率是84MHz,定時器18-11是   >168MHz

 (5)peroid,周期值(ARR)。定時器1/3/4/6-15[0-0xffff],定時器25[0-0x3fffffff]

 (6)mode,計數模式

   (7) Timer.UP - 0 ARR (默認)

    (8) Timer.DOWN - ARR 0.

    (9)Timer.CENTER - 0 ARR,然后到 0.

    (10)div,用於數值濾波器采樣時鍾,范圍是1/2/4

    (11)callback,定義回調函數,和Timer.callback()功能相同

    (12)deadtime,死區時間,通道切換時的停止時間(兩個通道都不會工作)。范圍是[0..1008],它有如下限制: 

         0-128 in steps of 1.

        128-256 in steps of 2,

          256-512 in steps of 8,

        512-1008 in steps of 16

     deadtime的測量是用source_freq 除以 div,它只對定時器1-8有效。

   (13) timer.deinit(): 禁止定時器,禁用回調函數,禁用任何定時器通道

   (14) timer.callback(fun): 設置定時器回調函數

   (15) timer.channel(channel, mode, ...):設置定時器通道

          -channel,定時器通道號

          -mode,模式

          -Timer.PWMPWM模式(高電平方式)

          -Timer.PWM_INVERTEDPWM模式(反相方式)

          -Timer.OC_TIMING,不驅動GPIO

          -Timer.OC_ACTIVE,比較匹配,高電平輸出

          -Timer.OC_INACTIVE,比較匹配,低電平輸出

          -Timer.OC_TOGGLE,比較匹配,翻轉輸出

          -Timer.OC_FORCED_ACTIVE,強制高,忽略比較匹配

          -Timer.OC_FORCED_INACTIVE,強制低,忽略比較匹配

          -Timer.IC,輸入撲捉模式

          -Timer.ENC_A,編碼模式,僅在CH1改變時修改計數器

          -Timer.ENC_B,編碼模式,僅在CH2改變時修改計數器

          -callback,每個通道的回調函數

          -pin,驅動GPIO,可以是None

    Timer.PWM 模式下的參數

         -pulse_width,脈沖寬度

         -pulse_width_percent,百分比計算的占空比

    Timer.OC 模式下的參數

         -compare,比較匹配寄存器初始值

          -polarity,極性

          -Timer.HIGH,輸出高

          -Timer.LOW,輸出低

    Timer.IC 模式下的參數(捕捉模式只有在主通道有效)

          -polarity

          -Timer.RISING,上升沿捕捉

          -Timer.FALLING,下降沿捕捉

          -Timer.BOTH,上升下降沿同時捕捉

    Timer.ENC 模式:

          -需要配置兩個Pin

          .使用 timer.counter() 方法讀取編碼值

          .只在CH1CH2上工作(CH1NCH2N不工作)

          .編碼模式時忽略通道號

 

 (16) timer.counter([value]): 設置或獲取定時器計數值

 (17) timer.freq([value]):設置或獲取定時器頻率

 (18) timer.period([value]):設置或獲取定時器周期

 (19) timer.prescaler([value]):設置或獲取定時器預分頻

 (20) timer.source_freq(): 獲取定時器源頻率(無預分頻)

 

4、利用重力傳感器控制LED亮度

 

  這里我們選用非板載LED,將一個LED接到X1A0)引腳,然后當板子向右傾斜時,LED越來越亮,當板子向左傾斜時,LED越來越暗。

LED接在了A0口,具體代碼如下:

 

 

# main.py -- put your code here!
from pyb import Pin, Timer

tm2=Timer(2, freq=200)
led3=tm2.channel(1, Timer.PWM, pin=Pin.cpu.A0)
accel = pyb.Accel()
while 1:
    x = accel.x()
    print(x)
led3.pulse_width_percent(x*5)

 

  實際效果:

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM