|
TWEN-ASR ONE 語音識別系列教程(2)— GPIO、ADC、PWM的使用
提示:作者使用 TWEN-ASR ONE V1.0開發(fā)板進行開發(fā)學(xué)習(xí)。
文章目錄
前言
一、TWEN-ASR ONE GPIO讀寫操作
1.1 GPIO 使用說明
1.2 GPIO 代碼編寫
1.3 GPIO 代碼分析1.4 GPIO 運行測試
1.5 GPIO 使用小結(jié)
二、TWEN-ASR ONE ADC讀取操作
2.1 ADC 使用說明
2.2 ADC 代碼編寫
2.3 ADC 代碼分析
2.4 ADC 運行測試
2.5 ADC 使用小結(jié)
三、TWEN-ASR ONE PWM使用
3.1 PWM 使用說明
3.2 PWM 代碼編寫
3.3 PWM 代碼分析
3.4 PWM 運行測試
3.5 PWM 使用小結(jié)
四、總結(jié)
前言
通過《TWEN-ASR 語音識別系列教程(1)—運行第一個程序》文章,我們學(xué)習(xí)了如何編寫一個TWEN-ASR程序、下載程序、調(diào)試程序。從上文可知,TWEN-ASR ONE開發(fā)板引腳豐富,引腳主要功能有GPIO、ADC、PWM、 UART、IIC、SPI。本文將介紹TWEN-ASR ONE的GPIO、ADC、PWM使用。 主要內(nèi)容有:
TWEN-ASR GPIO讀寫操作;
TWEN-ASR ADC獲取當(dāng)前電壓值;
TWEN-ASR 根據(jù)ADC的值,使用PWM調(diào)節(jié)紅燈的亮度。
一、TWEN-ASR ONE GPIO讀寫操作
1.1 GPIO 使用說明
了解GPIO使用前,先了解TWEN-ASR ONE芯片的一些信息,如下圖所示芯片引腳信息圖。
圖1.1 TWEN-ASR ONE 引腳信息圖
TWEN-ASR GPIO可支持27個GPIO口(IO功能復(fù)用)、每個GPIO口可配置中斷功能、支持兩路帶濾波功能外部中斷。因為IO功能復(fù)用,所以GPIO工作前需要選擇引腳功能。當(dāng)然如果使用默認的話,可以不設(shè)置。 例如P0_0引腳功能[1]如下圖1.2 引腳功能描述圖所示:
圖1.2 引腳功能描述圖
從上圖1.2可以看出,P0_0是芯片的第4引腳,IO口有4mA的驅(qū)動能力。默認是輸入模式。T+D表示三態(tài)下拉。具體的狀態(tài)定義如下表1.1所示。
表1.1 狀態(tài)定義表
1.2 GPIO 代碼編寫
根據(jù)前面的分析,如果我們使用P0_0為GPIO的輸入輸出引腳,需要設(shè)定為第一功能引腳。同時根據(jù)使用需求,設(shè)置為輸入或輸出模式。
(1)P0_0輸出模式測試程序。 實現(xiàn)程序主要是通過P0_0輸出高低電平,控制燈的亮滅。電路原理圖如下:
圖1.3 P0_0外接擴展電路圖
其中,高電平紅燈滅,低電平紅燈亮。 這與官方的板載RGB燈恰好相反。具體代碼編寫如下:
圖形代碼:
圖1.4 P0_0輸出模式測試程序圖
字符代碼:
#include "asr.h"
#include "setup.h"
uint32_t snid;
void ASR_CODE();
//{ID:250,keyword:"命令詞",ASR:"最大音量",ASRTO:"音量調(diào)整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調(diào)整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調(diào)整到最小"}
void app(){
while (1) {
digitalWrite(0,1);
delay(1000);
digitalWrite(0,0);
delay(1000);
}
vTaskDelete(NULL);
}
/*描述該功能...
*/
void ASR_CODE(){
if((snid) == 4){
digitalWrite(13,1);
}
if((snid) == 6){
digitalWrite(13,0);
}
}
void setup()
{
//{speak:小蝶-清新女聲,vol:10,speed:10}
//{playid:10001,voice:歡迎使用智能管家,用智能管家喚醒我。}
//{playid:10002,voice:我退下了,用智能管家喚醒我}
//{ID:2,keyword:"喚醒詞",ASR:"智能管家",ASRTO:"我在"}
//{ID:4,keyword:"命令詞",ASR:"打開紅燈",ASRTO:"好的,馬上打開紅燈"}
//{ID:6,keyword:"命令詞",ASR:"關(guān)閉紅燈",ASRTO:"好的,馬上關(guān)閉紅燈"}
setPinFun(0,FIRST_FUNCTION);
pinMode(0,output);
xTaskCreate(app,"app",128,NULL,4,NULL);
}
(2)P0_0輸入模式。 實現(xiàn)程序主要是按鍵按下,P0_0獲取到高電平;按鍵松開,P0_0獲取到低電平。 電路原理圖如下:
圖1.5 P0_0 按鍵輸入接線圖
也許有人會疑問為什么KEY1 1引腳接3.3V。因為P0_0默認T+D(三態(tài)下拉),即默認P0_0懸空的情況下,讀取到的是低電平。 所以KEY1 1引腳接3.3V,當(dāng)按鍵KEY1按下時,P0_0讀取到高電平,松開按鍵KEY1讀取到低電平。
圖形代碼:
圖1.6 P0_0輸入模式程序圖
字符代碼:
#include "asr.h"
#include "setup.h"
#include "HardwareSerial.h"
uint32_t snid;
void ASR_CODE();
//{ID:250,keyword:"命令詞",ASR:"最大音量",ASRTO:"音量調(diào)整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調(diào)整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調(diào)整到最小"}
void app(){
while (1) {
Serial.println((digitalRead(0)));
delay(1000);
}
vTaskDelete(NULL);
}
/*描述該功能...
*/
void ASR_CODE(){
if((snid) == 4){
digitalWrite(13,1);
}
if((snid) == 6){
digitalWrite(13,0);
}
}
void setup()
{
Serial.begin(9600);
//{speak:小蝶-清新女聲,vol:10,speed:10}
//{playid:10001,voice:歡迎使用智能管家,用智能管家喚醒我。}
//{playid:10002,voice:我退下了,用智能管家喚醒我}
//{ID:2,keyword:"喚醒詞",ASR:"智能管家",ASRTO:"我在"}
//{ID:4,keyword:"命令詞",ASR:"打開紅燈",ASRTO:"好的,馬上打開紅燈"}
//{ID:6,keyword:"命令詞",ASR:"關(guān)閉紅燈",ASRTO:"好的,馬上關(guān)閉紅燈"}
setPinFun(0,FIRST_FUNCTION);
pinMode(0,input);
xTaskCreate(app,"app",128,NULL,4,NULL);
}
1.3 GPIO 代碼分析
如果上面的代碼含義明白可以跳過【1.3節(jié)代碼分析】。不太清楚,可以參考下面的代碼分析。
(1)P0_0輸出模式測試程序分析。
初始化:
設(shè)置引腳功能為第一引腳功能;
設(shè)置輸出模式。
線程中寫操作:
使用寫引腳塊,可設(shè)置為高,低電平。
在線程中,重復(fù)執(zhí)行P0_0高電平,低電平。中間延時一秒鐘。關(guān)鍵代碼注釋如下:
圖1.7 P0_0輸出模式程序注釋圖
(2)P0_0輸入模式測試程序分析。
初始化:
設(shè)置串口0波特率為9600;
設(shè)置引腳功能為第一引腳功能;
設(shè)置輸入模式。
線程中讀操作:
使用讀引腳塊,讀取的內(nèi)容通過串口打印出來。
在線程中,每秒鐘讀取P0_0狀態(tài),并通過串口打印出來。關(guān)鍵代碼注釋如下:
圖1.8 P0_0輸入模式程序注釋圖
1.4 GPIO 運行測試
(1)P0_0輸出模式程序運行測試。 紅燈閃爍,紅燈每間隔一秒亮或滅。輸出高電平紅燈滅,輸出高電平紅燈亮。
圖1.9 P0_0輸出高電平紅燈滅
圖1.10 P0_0輸出低電平紅燈亮
(2)P0_0輸入模式程序運行測試。 當(dāng)松開按鍵讀取到低電平,當(dāng)按鍵按下時,P0_0讀取到高電平。具體測試結(jié)果如下圖所示。
圖1.11 P0_0輸入模式松開按鍵
圖1.12 P0_0輸入模式按下按鍵
1.5 GPIO 使用小結(jié)
GPIO的使用,一般需要設(shè)置功能引腳,設(shè)置輸入輸出模式,輸入模式對應(yīng)讀取引腳狀態(tài),輸出模式對應(yīng)輸出高或低電平。實際使用設(shè)置功能引腳需要查看芯片引腳功能描述。而輸入或輸出模式則需要根據(jù)實際使用情況設(shè)置。
二、TWEN-ASR ONE ADC讀取操作
2.1 ADC 使用說明
TWEN-ASR ONE ADC擁有4路12bit SAR ADC輸入通道。 ADC IO可與數(shù)字GPIO進行功能復(fù)用。從圖1.1 TWEN-ASR ONE 引腳信息圖,可知ADC 引腳分別是AIN0~AIN3,對應(yīng)是P0_0 ~P0_3。因為IO復(fù)用特別需要注意功能引腳設(shè)置。而ADC是默認的功能。所以使用ADC無需另外設(shè)置功能引腳。
2.2 ADC 代碼編寫
實現(xiàn)程序主要是讀取AIN0數(shù)值,并進行電壓換算,最后用串口打印電壓值。 關(guān)于電壓的換算,由于TWEN-ASR是12位的ADC,那么讀取的范圍0 ~(212 - 1),即0 ~ 4095。0對應(yīng)電壓為0V,4095對應(yīng)3.3V(參考電壓)。讀取數(shù)值和電壓是線性關(guān)系,換算公式1如下:
U = V a l 4095 ∗ 3.3 v U=\frac{Val}{4095}*3.3v
U=
4095
Val
∗3.3v
--- 公式1
其中, V a l Val Val是讀取的ADC值, U U U是換算出來的電壓值。測試ADC將會使用滑動電位器, 測試電路原理如下圖2.1所示:
圖2.1 ADC測試接線圖
其中,P0_0對應(yīng)AIN0,滑到最左邊電壓為3.3V,滑到最右邊電壓為0V。
圖形代碼:
圖2.2 ADC測試程序圖
字符代碼:
#include "asr.h"
#include "setup.h"
#include "HardwareSerial.h"
uint32_t snid;
float res = 0;
void ASR_CODE();
//{ID:250,keyword:"命令詞",ASR:"最大音量",ASRTO:"音量調(diào)整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調(diào)整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調(diào)整到最小"}
void app(){
while (1) {
Serial.print("U=");
Serial.print(((adc_read(0) / 4096.0) * 3.3));
Serial.println("V");
delay(1000);
}
vTaskDelete(NULL);
}
/*描述該功能...
*/
void ASR_CODE(){
switch (snid) {
case 4:
digitalWrite(13,1);
break;
case 6:
digitalWrite(13,0);
break;
}
}
void setup()
{
Serial.begin(9600);
//{speak:小蝶-清新女聲,vol:10,speed:10}
//{playid:10001,voice:歡迎使用智能管家,用智能管家喚醒我。}
//{playid:10002,voice:我退下了,用智能管家喚醒我}
//{ID:2,keyword:"喚醒詞",ASR:"智能管家",ASRTO:"我在"}
//{ID:4,keyword:"命令詞",ASR:"打開紅燈",ASRTO:"好的,馬上打開紅燈"}
//{ID:6,keyword:"命令詞",ASR:"關(guān)閉紅燈",ASRTO:"好的,馬上關(guān)閉紅燈"}
xTaskCreate(app,"app",128,NULL,4,NULL);
}
2.3 ADC 代碼分析
如果上面的代碼含義明白可以跳過【2.3 ADC 代碼分析】。不太清楚,可以參考下面的代碼分析。
P0_0引腳默認是ADC功能引腳,所以不需要設(shè)置功能引腳。 在線程app里面,"讀入ADC值A(chǔ)N0"就是讀取AIN0的值,并根據(jù)公式1進行電壓換算。
圖2.3 ADC測試程序注釋圖
2.4 ADC 運行測試
程序下載完后,打開串口監(jiān)視器。
圖2.4 萬用表與串口打印數(shù)據(jù)比較(1)圖
由上圖可知,串口打印出U=3.3 V,而實際萬用表測出來是3.608V,誤差有0.308V左右。因為參考電壓選用了3.3V,而實際是3.608V。當(dāng)我再次測量ASR-ONE 3.3V引腳時,實測電壓為3.637V。所以修改程序為:
圖2.5 根據(jù)實測3.3V引腳電壓,修改程序圖
調(diào)節(jié)滑動電位器,到最左端。萬用表實測電壓為3.640V,串口輸出為3.63V或3.64V。可見經(jīng)過修改參考值后,數(shù)據(jù)與萬用表接近。
圖2.6 萬用表與串口打印數(shù)據(jù)比較(2)圖
再次調(diào)節(jié)滑動電位器。萬用表實測電壓為2.275V,串口輸出為2.27、2.28、2.29V。可見數(shù)據(jù)與萬用表接近。誤差還是很小的,在接受范圍內(nèi)。
圖2.7 萬用表與串口打印數(shù)據(jù)比較(3)圖
2.5 ADC 使用小結(jié)
ADC 使用不需要設(shè)置功能引腳,因為默認就是ADC功能。ADC 引腳分別是AIN0~AIN3,對應(yīng)是P0_0 ~P0_3。本文使用P0_0進行測試,可見ADC使用,需要對參考電壓的修正,才能準確測量出電壓值。當(dāng)然如果使用穩(wěn)壓管的電壓作為參考電壓,這樣就不用修正。或者ASR-ONE是否有內(nèi)部的基準電壓可用。想要用好ASR-ONE的ADC還需要對芯片更多的了解。
三、TWEN-ASR ONE PWM使用
3.1 PWM 使用說明
PWM,英文名Pulse Width Modulation,是脈沖寬度調(diào)制縮寫,它是通過對一系列脈沖的寬度進行調(diào)制,等效出所需要的波形(包含形狀以及幅值),對模擬信號電平進行數(shù)字編碼,也就是說通過調(diào)節(jié)占空比的變化來調(diào)節(jié)信號、能量等的變化,占空比就是指在一個周期內(nèi),信號處于高電平的時間占據(jù)整個信號周期的百分比,例如方波的占空比就是50%[2]。
圖3.1 PWM占空比示意圖
在天問Block軟件中,有兩個PWM相關(guān)的塊。使用PWM只需要進行PWM初始化,設(shè)置占空比、初始值、調(diào)整占空比。
圖3.2 天問Block PWM相關(guān)塊
3.2 PWM 代碼編寫
實現(xiàn)程序主要是讀取AIN0數(shù)值,根據(jù)讀到的數(shù)值,調(diào)節(jié)板載RGB燈的綠燈的亮度,值越大亮度越大,反之,亮度越小。 RGB燈的電路原理圖如下所示:
圖3.3 RGB燈電路原理圖
其中,PWM5是控制綠燈。
圖形代碼:
圖3.4 PWM測試程序圖
字符代碼:
#include "asr.h"
#include "setup.h"
uint32_t snid;
void ASR_CODE();
//{ID:250,keyword:"命令詞",ASR:"最大音量",ASRTO:"音量調(diào)整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調(diào)整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調(diào)整到最小"}
void app(){
while (1) {
pwm_set_duty(PWM5,adc_read(0),0x1000);
delay(50);
}
vTaskDelete(NULL);
}
/*描述該功能...
*/
void ASR_CODE(){
if((snid) == 4){
digitalWrite(13,1);
}
if((snid) == 6){
digitalWrite(13,0);
}
}
void setup()
{
//{speak:小蝶-清新女聲,vol:10,speed:10}
//{playid:10001,voice:歡迎使用智能管家,用智能管家喚醒我。}
//{playid:10002,voice:我退下了,用智能管家喚醒我}
//{ID:2,keyword:"喚醒詞",ASR:"智能管家",ASRTO:"我在"}
//{ID:4,keyword:"命令詞",ASR:"打開紅燈",ASRTO:"好的,馬上打開紅燈"}
//{ID:6,keyword:"命令詞",ASR:"關(guān)閉紅燈",ASRTO:"好的,馬上關(guān)閉紅燈"}
setPinFun(14,SECOND_FUNCTION);
PWM_enble(PWM5,1000,0x1000,0x000);
pwm_set_duty(PWM5,adc_read(0),0x1000);
xTaskCreate(app,"app",128,NULL,4,NULL);
}
3.3 PWM 代碼分析
如果上面的代碼含義明白可以跳過【3.3 PWM 代碼分析】。不太清楚,可以參考下面的代碼分析。
PWM 頻率設(shè)置為1000,最大占空比為0x1000。這么設(shè)置是因為ADC最大值為0xFFF。
圖3.5 PWM測試程序注釋圖
3.4 PWM 運行測試
調(diào)節(jié)電位器的大小。AIN0讀到值大時,燈會比較亮。如下圖所示:
圖3.6 ADC數(shù)值較大時
AIN0讀到值小時,燈會比較暗。如下圖所示:
圖3.7 ADC數(shù)值較小時
改變PWM占空比,相當(dāng)于改變PWM5引腳的電壓值,從而達到調(diào)節(jié)亮度的目的。
3.5 PWM 使用小結(jié)
在天問Block軟件里面,PWM使用非常便捷,設(shè)置頻率,設(shè)置占空比。PWM塊有PWM0~PWM5可以使用。PWM在控制直流電機速度、LED燈亮度等等場合應(yīng)用比較多,使用ASR-ONE可以快速的實現(xiàn)想要的效果。
四、總結(jié)
本文介紹TWEN-ASR ONE的GPIO、ADC、PWM使用。GPIO使用,設(shè)置功能引腳,設(shè)置為輸入輸出模式。ADC使用,需要注意參考電壓,12位ADC的數(shù)值范圍為0~4095。PWM使用,設(shè)置頻率,占空比。TWEN-ASR-ONE總體來說,不管GPIO、ADC、PWM編程實現(xiàn)非常方便,有很多塊可以使用。
————————————————
版權(quán)聲明:本文為CSDN博主「初五霸」的原創(chuàng)文章,遵循CC 4.0 BY-SA版權(quán)協(xié)議,轉(zhuǎn)載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yang_zijing/article/details/117950296
|
|