轉載請注明:@小五義 http://www.cnblogs.com/xiaowuyi 歡迎加入討論群 64770604
一、實驗器材
1、TPYboard V102板 一塊
2、LED燈 一個
3、1602 屏 一塊
二、重力傳感器
TPYboard與pyboard一樣,本身帶一個重力傳感器。該傳感器能夠感知到加速力的變化。加速力就是當物體在加速過程中作用在物體上的力,比如晃動、跌落、上升、下降等各種移動變化都能被轉化為電信號。
TPYBoard使用的是MMA7660重力傳感器,主要用於檢測X、Y、Z三個軸所受到的加速度大小。檢測范圍是-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是一致的,其pwm是Timer的一種工作模式,它需要使用到Timer和Pin兩個庫。這里來看一下如何控制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-7和12-14最高頻率是84MHz,定時器1、8-11是 >168MHz
(5)peroid,周期值(ARR)。定時器1/3/4/6-15是 [0-0xffff],定時器2和5是[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.PWM,PWM模式(高電平方式)
-Timer.PWM_INVERTED,PWM模式(反相方式)
-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() 方法讀取編碼值
.只在CH1或CH2上工作(CH1N和CH2N不工作)
.編碼模式時忽略通道號
(16) timer.counter([value]): 設置或獲取定時器計數值
(17) timer.freq([value]):設置或獲取定時器頻率
(18) timer.period([value]):設置或獲取定時器周期
(19) timer.prescaler([value]):設置或獲取定時器預分頻
(20) timer.source_freq(): 獲取定時器源頻率(無預分頻)
4、利用重力傳感器控制LED亮度
這里我們選用非板載LED,將一個LED接到X1(A0)引腳,然后當板子向右傾斜時,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)
實際效果:

