wringPi 初始化GPIO 为上拉_玩转GPIO之PWM点亮呼吸灯(非树莓派)
在這篇文章,我介紹了基于逸宸電子開發(fā)的總線適配器來點亮LED燈的基本方法!
myastrotong:玩轉(zhuǎn)GPIO之點燈(非樹莓派)?zhuanlan.zhihu.com這款總線適配器的介紹見這里:
工業(yè)級高速USB轉(zhuǎn)SPI I2C PWM GPIO UART CAN接口電壓可軟件配置?item.taobao.com沒錯,就是這個物件,一款USB轉(zhuǎn)GPIO等常見接口的總線適配器,看上去牛皮的不得了。
學會了點燈,自然要挖掘一些高級點的玩法,以下是基于這個總線適配器點亮呼吸燈的玩法。
在很多需要調(diào)光的場合都采用PWM(脈沖調(diào)制)的方式調(diào)光(也稱為“數(shù)字調(diào)光”),就是在固定流經(jīng)LED的電流大小的情況下,通過占空比可調(diào)節(jié)的PWM脈沖來反復控制LED的導通和關(guān)斷 。 導通的時候LED按照設(shè)定好的電流值發(fā)出相應(yīng)亮度的光,關(guān)斷的時候LED不亮。如果PWM脈沖的重復周期高于人眼視覺暫留需要的頻率,特別是達到50Hz以上后,一般人眼就覺察不出LED的閃爍了,從而通過改變PWM脈沖的占空比就能夠改變LED的亮度。
熄滅之前就又打開了,那么燈實際上是會維持在一個亮度的,或者你的眼睛看上去燈會維持在一個亮度。如果你一直保持某一個固定的頻率,那么電燈就會保持一個固定的亮度。理論上,你可以通過調(diào)整開燈持續(xù)的時間長度和關(guān)燈持續(xù)的時間長度的比例,從而得到不同亮度。這個比例被稱為“占空比”。
通過調(diào)整“占空比”就可以做到呼吸燈的效果。
準備硬件:一個三色信號燈(你也可以選擇一個發(fā)光二極管和一個電阻,我這里僅僅是為了方便)、兩根母對公杜邦線。
查詢官方文檔,總線適配器的各個GPIO的定義如下:
我選擇接入PWM_CH3接口端(也就是P8端口)。白色杜邦線接入CH3接口和三色燈的G口,黃色杜邦線接入總線適配器的GND端和三色燈的GND端。
接好的效果圖如下:
然后基于官方示例文件進行修改。修改examplespythonUSB2PWMUSB2PWM_Test下面的USB2PWM_Test.py文件:
from ctypes import * import platform from time import sleep from usb_device import * from usb2pwm import *if __name__ == '__main__': DevIndex = 0DevHandles = (c_int * 20)()# Scan deviceret = USB_ScanDevice(byref(DevHandles))if(ret == 0):print("No device connected!")exit()else:print("Have %d device connected!"%ret)# Open deviceret = USB_OpenDevice(DevHandles[DevIndex])if(bool(ret)):print("Open device success!")else:print("Open device faild!")exit()# Get device infomationUSB2XXXInfo = DEVICE_INFO()USB2XXXFunctionString = (c_char * 256)()ret = DEV_GetDeviceInfo(DevHandles[DevIndex],byref(USB2XXXInfo),byref(USB2XXXFunctionString))if(bool(ret)):print("USB2XXX device infomation:")print("--Firmware Name: %s"%bytes(USB2XXXInfo.FirmwareName).decode('ascii'))print("--Firmware Version: v%d.%d.%d"%((USB2XXXInfo.FirmwareVersion>>24)&0xFF,(USB2XXXInfo.FirmwareVersion>>16)&0xFF,USB2XXXInfo.FirmwareVersion&0xFFFF))print("--Hardware Version: v%d.%d.%d"%((USB2XXXInfo.HardwareVersion>>24)&0xFF,(USB2XXXInfo.HardwareVersion>>16)&0xFF,USB2XXXInfo.HardwareVersion&0xFFFF))print("--Build Date: %s"%bytes(USB2XXXInfo.BuildDate).decode('ascii'))print("--Serial Number: ",end='')for i in range(0, len(USB2XXXInfo.SerialNumber)):print("%08X"%USB2XXXInfo.SerialNumber[i],end='')print("")print("--Function String: %s"%bytes(USB2XXXFunctionString.value).decode('ascii'))else:print("Get device infomation faild!")exit()# Initialize adcPWMConfig = PWM_CONFIG()#我選的是P8,對應(yīng)的PWM是CH3 二進制是1000 ->16進制是0x08PWMConfig.ChannelMask = 0x08for i in range(0,8):PWMConfig.Polarity[i] = 1 # 將所有PWM通道都設(shè)置為正極性for i in range(0,8):PWMConfig.Precision[i] = 100 # 將所有通道的占空比調(diào)節(jié)精度都設(shè)置為1%for i in range(0,8):PWMConfig.Prescaler[i] = 10 # 將所有通道的預(yù)分頻器都設(shè)置為10,則PWM輸出頻率為200MHz/(PWMConfig.Precision*PWMConfig.Prescaler)for i in range(0,8):PWMConfig.Pulse[i] = PWMConfig.Precision[i]*30//100 # 將所有通道的占空比都設(shè)置為30%# 初始化PWMret = PWM_Init(DevHandles[DevIndex],byref(PWMConfig));if ret != PWM_SUCCESS:print("Initialize pwm faild!")exit()else:print("Initialize pwm sunccess!")print(DevHandles[DevIndex])# 啟動PWM,RunTimeOfUs之后自動停止,利用該特性可以控制輸出脈沖個數(shù),脈沖個數(shù)=RunTimeOfUs*200/(PWMConfig.Precision*PWMConfig.Prescaler)#RunTimeOfUs=0,表示一直輸出 RunTimeOfUs = 0ret = PWM_Start(DevHandles[DevIndex],PWMConfig.ChannelMask,RunTimeOfUs)if(ret != PWM_SUCCESS):print("Start pwm faild!")exit()else:print("Start pwm sunccess!")try:while (True):#改變PWM波形占空比 for j in range(0,101,2):for i in range(0,8):PWMConfig.Pulse[i] = j PWM_SetPulse(DevHandles[DevIndex],PWMConfig.ChannelMask,PWMConfig.Pulse)sleep(0.05) for j in range(100,-1,-2):for i in range(0,8):PWMConfig.Pulse[i] = j PWM_SetPulse(DevHandles[DevIndex],PWMConfig.ChannelMask,PWMConfig.Pulse) sleep(0.05) except KeyboardInterrupt:pass# 停止PWM# l、et = PWM_Stop(DevHandles[DevIndex],PWMConfig.ChannelMask)# if(ret != PWM_SUCCESS):# print("Stop pwm faild!");# exit()# else:# print("Stop pwm sunccess!")# Close deviceret = USB_CloseDevice(DevHandles[DevIndex])if(bool(ret)):print("Close device success!")else:print("Close device faild!")exit()關(guān)鍵控制電路部分的代碼為:
我選擇的是CH03端口,所以對應(yīng)的
PWMConfig.ChannelMask = 0x08然后程序通過修改如下代碼來改變占空比:
PWMConfig.Pulse[i] = j并且先通過占空比增加,然后使占空比減小,從而得到呼吸燈暗亮的間歇變化。
效果視頻如下:
點亮一盞呼吸燈https://www.zhihu.com/video/1224789136399835136以上就是通過PWM來點亮一盞呼吸燈的全部過程。
總結(jié)
以上是生活随笔為你收集整理的wringPi 初始化GPIO 为上拉_玩转GPIO之PWM点亮呼吸灯(非树莓派)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: excel转html中文乱码,英文系统中
- 下一篇: nrf52840 gpiote如何配置中