久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: TWEN-ASR ONE 語音識別系列教程(2)— GPIO、ADC、PWM的使用 [打印本頁]

作者: twjs    時間: 2021-6-18 19:24
標題: TWEN-ASR ONE 語音識別系列教程(2)— GPIO、ADC、PWM的使用
TWEN-ASR ONE 語音識別系列教程(2)— GPIO、ADC、PWM的使用
提示:作者使用 TWEN-ASR ONE V1.0開發板進行開發學習。

文章目錄

前言
一、TWEN-ASR ONE GPIO讀寫操作
1.1 GPIO 使用說明
1.2 GPIO 代碼編寫
1.3 GPIO 代碼分析1.4 GPIO 運行測試
1.5 GPIO 使用小結
二、TWEN-ASR ONE ADC讀取操作
2.1 ADC 使用說明
2.2 ADC 代碼編寫
2.3 ADC 代碼分析
2.4 ADC 運行測試
2.5 ADC 使用小結
三、TWEN-ASR ONE PWM使用
3.1 PWM 使用說明
3.2 PWM 代碼編寫
3.3 PWM 代碼分析
3.4 PWM 運行測試
3.5 PWM 使用小結
四、總結
前言

    通過《TWEN-ASR 語音識別系列教程(1)—運行第一個程序》文章,我們學習了如何編寫一個TWEN-ASR程序、下載程序、調試程序。從上文可知,TWEN-ASR ONE開發板引腳豐富,引腳主要功能有GPIO、ADC、PWM、 UART、IIC、SPI。本文將介紹TWEN-ASR ONE的GPIO、ADC、PWM使用。 主要內容有:

TWEN-ASR GPIO讀寫操作;
TWEN-ASR ADC獲取當前電壓值;
TWEN-ASR 根據ADC的值,使用PWM調節紅燈的亮度。

一、TWEN-ASR ONE GPIO讀寫操作

1.1 GPIO 使用說明

    了解GPIO使用前,先了解TWEN-ASR ONE芯片的一些信息,如下圖所示芯片引腳信息圖。


圖1.1 TWEN-ASR ONE 引腳信息圖
    TWEN-ASR GPIO可支持27個GPIO口(IO功能復用)、每個GPIO口可配置中斷功能、支持兩路帶濾波功能外部中斷。因為IO功能復用,所以GPIO工作前需要選擇引腳功能。當然如果使用默認的話,可以不設置。 例如P0_0引腳功能[1]如下圖1.2 引腳功能描述圖所示:


圖1.2 引腳功能描述圖
從上圖1.2可以看出,P0_0是芯片的第4引腳,IO口有4mA的驅動能力。默認是輸入模式。T+D表示三態下拉。具體的狀態定義如下表1.1所示。

表1.1 狀態定義表


1.2 GPIO 代碼編寫

    根據前面的分析,如果我們使用P0_0為GPIO的輸入輸出引腳,需要設定為第一功能引腳。同時根據使用需求,設置為輸入或輸出模式。
    (1)P0_0輸出模式測試程序。 實現程序主要是通過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:"音量調整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調整到最小"}
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:"關閉紅燈",ASRTO:"好的,馬上關閉紅燈"}
  setPinFun(0,FIRST_FUNCTION);
  pinMode(0,output);
  xTaskCreate(app,"app",128,NULL,4,NULL);

}

(2)P0_0輸入模式。 實現程序主要是按鍵按下,P0_0獲取到高電平;按鍵松開,P0_0獲取到低電平。 電路原理圖如下:


圖1.5 P0_0 按鍵輸入接線圖
也許有人會疑問為什么KEY1 1引腳接3.3V。因為P0_0默認T+D(三態下拉),即默認P0_0懸空的情況下,讀取到的是低電平。 所以KEY1 1引腳接3.3V,當按鍵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:"音量調整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調整到最小"}
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:"關閉紅燈",ASRTO:"好的,馬上關閉紅燈"}
  setPinFun(0,FIRST_FUNCTION);
  pinMode(0,input);
  xTaskCreate(app,"app",128,NULL,4,NULL);

}

1.3 GPIO 代碼分析

    如果上面的代碼含義明白可以跳過【1.3節代碼分析】。不太清楚,可以參考下面的代碼分析。

    (1)P0_0輸出模式測試程序分析。

初始化:
設置引腳功能為第一引腳功能;
設置輸出模式。
線程中寫操作:
使用寫引腳塊,可設置為高,低電平。
在線程中,重復執行P0_0高電平,低電平。中間延時一秒鐘。關鍵代碼注釋如下:



圖1.7 P0_0輸出模式程序注釋圖
    (2)P0_0輸入模式測試程序分析。

初始化:

設置串口0波特率為9600;
設置引腳功能為第一引腳功能;
設置輸入模式。
線程中讀操作:

使用讀引腳塊,讀取的內容通過串口打印出來。
在線程中,每秒鐘讀取P0_0狀態,并通過串口打印出來。關鍵代碼注釋如下:


圖1.8 P0_0輸入模式程序注釋圖
1.4 GPIO 運行測試

    (1)P0_0輸出模式程序運行測試。 紅燈閃爍,紅燈每間隔一秒亮或滅。輸出高電平紅燈滅,輸出高電平紅燈亮。


圖1.9 P0_0輸出高電平紅燈滅



圖1.10 P0_0輸出低電平紅燈亮
    (2)P0_0輸入模式程序運行測試。 當松開按鍵讀取到低電平,當按鍵按下時,P0_0讀取到高電平。具體測試結果如下圖所示。


圖1.11 P0_0輸入模式松開按鍵


圖1.12 P0_0輸入模式按下按鍵
1.5 GPIO 使用小結

    GPIO的使用,一般需要設置功能引腳,設置輸入輸出模式,輸入模式對應讀取引腳狀態,輸出模式對應輸出高或低電平。實際使用設置功能引腳需要查看芯片引腳功能描述。而輸入或輸出模式則需要根據實際使用情況設置。

二、TWEN-ASR ONE ADC讀取操作

2.1 ADC 使用說明

    TWEN-ASR ONE ADC擁有4路12bit SAR ADC輸入通道。 ADC IO可與數字GPIO進行功能復用。從圖1.1 TWEN-ASR ONE 引腳信息圖,可知ADC 引腳分別是AIN0~AIN3,對應是P0_0 ~P0_3。因為IO復用特別需要注意功能引腳設置。而ADC是默認的功能。所以使用ADC無需另外設置功能引腳。

2.2 ADC 代碼編寫

    實現程序主要是讀取AIN0數值,并進行電壓換算,最后用串口打印電壓值。 關于電壓的換算,由于TWEN-ASR是12位的ADC,那么讀取的范圍0 ~(212 - 1),即0 ~ 4095。0對應電壓為0V,4095對應3.3V(參考電壓)。讀取數值和電壓是線性關系,換算公式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對應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:"音量調整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調整到最小"}
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:"關閉紅燈",ASRTO:"好的,馬上關閉紅燈"}
  xTaskCreate(app,"app",128,NULL,4,NULL);

}


2.3 ADC 代碼分析

    如果上面的代碼含義明白可以跳過【2.3 ADC 代碼分析】。不太清楚,可以參考下面的代碼分析。
    P0_0引腳默認是ADC功能引腳,所以不需要設置功能引腳。 在線程app里面,"讀入ADC值AN0"就是讀取AIN0的值,并根據公式1進行電壓換算。


圖2.3 ADC測試程序注釋圖
2.4 ADC 運行測試

    程序下載完后,打開串口監視器。

圖2.4 萬用表與串口打印數據比較(1)圖

由上圖可知,串口打印出U=3.3 V,而實際萬用表測出來是3.608V,誤差有0.308V左右。因為參考電壓選用了3.3V,而實際是3.608V。當我再次測量ASR-ONE 3.3V引腳時,實測電壓為3.637V。所以修改程序為:


圖2.5 根據實測3.3V引腳電壓,修改程序圖
調節滑動電位器,到最左端。萬用表實測電壓為3.640V,串口輸出為3.63V或3.64V。可見經過修改參考值后,數據與萬用表接近。


圖2.6 萬用表與串口打印數據比較(2)圖
再次調節滑動電位器。萬用表實測電壓為2.275V,串口輸出為2.27、2.28、2.29V。可見數據與萬用表接近。誤差還是很小的,在接受范圍內。


圖2.7 萬用表與串口打印數據比較(3)圖
2.5 ADC 使用小結

     ADC 使用不需要設置功能引腳,因為默認就是ADC功能。ADC 引腳分別是AIN0~AIN3,對應是P0_0 ~P0_3。本文使用P0_0進行測試,可見ADC使用,需要對參考電壓的修正,才能準確測量出電壓值。當然如果使用穩壓管的電壓作為參考電壓,這樣就不用修正。或者ASR-ONE是否有內部的基準電壓可用。想要用好ASR-ONE的ADC還需要對芯片更多的了解。

三、TWEN-ASR ONE PWM使用

3.1 PWM 使用說明

    PWM,英文名Pulse Width Modulation,是脈沖寬度調制縮寫,它是通過對一系列脈沖的寬度進行調制,等效出所需要的波形(包含形狀以及幅值),對模擬信號電平進行數字編碼,也就是說通過調節占空比的變化來調節信號、能量等的變化,占空比就是指在一個周期內,信號處于高電平的時間占據整個信號周期的百分比,例如方波的占空比就是50%[2]。


圖3.1 PWM占空比示意圖
    在天問Block軟件中,有兩個PWM相關的塊。使用PWM只需要進行PWM初始化,設置占空比、初始值、調整占空比。


圖3.2 天問Block PWM相關塊
3.2 PWM 代碼編寫

    實現程序主要是讀取AIN0數值,根據讀到的數值,調節板載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:"音量調整到最大"}
//{ID:251,keyword:"命令詞",ASR:"中等音量",ASRTO:"音量調整到中等"}
//{ID:252,keyword:"命令詞",ASR:"最小音量",ASRTO:"音量調整到最小"}
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:"關閉紅燈",ASRTO:"好的,馬上關閉紅燈"}
  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 頻率設置為1000,最大占空比為0x1000。這么設置是因為ADC最大值為0xFFF。


圖3.5 PWM測試程序注釋圖
3.4 PWM 運行測試

    調節電位器的大小。AIN0讀到值大時,燈會比較亮。如下圖所示:


圖3.6 ADC數值較大時
    AIN0讀到值小時,燈會比較暗。如下圖所示:



圖3.7 ADC數值較小時
改變PWM占空比,相當于改變PWM5引腳的電壓值,從而達到調節亮度的目的。

3.5 PWM 使用小結

    在天問Block軟件里面,PWM使用非常便捷,設置頻率,設置占空比。PWM塊有PWM0~PWM5可以使用。PWM在控制直流電機速度、LED燈亮度等等場合應用比較多,使用ASR-ONE可以快速的實現想要的效果。

四、總結

    本文介紹TWEN-ASR ONE的GPIO、ADC、PWM使用。GPIO使用,設置功能引腳,設置為輸入輸出模式。ADC使用,需要注意參考電壓,12位ADC的數值范圍為0~4095。PWM使用,設置頻率,占空比。TWEN-ASR-ONE總體來說,不管GPIO、ADC、PWM編程實現非常方便,有很多塊可以使用。
————————————————
版權聲明:本文為CSDN博主「初五霸」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/yang_zijing/article/details/117950296






歡迎光臨 (http://m.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 欧美国产精品 | 3d动漫精品h区xxxxx区 | 波多野结衣乳巨码无在线观看 | 三上悠亚激情av一区二区三区 | av一区二区三区在线观看 | 日韩一区二区三区四区 | 精品国产久 | 国产又粗又黄又爽又硬的视频 | 亚洲成人久久久 | 成人免费毛片嘿嘿连载视频 | 国产a久久麻豆入口 | 亚洲激情欧美激情 | 黄色精品视频 | 在线观看视频国产 | 91麻豆精品国产91久久久久久 | 99精品网站 | 国产91av视频 | 一级片黄色 | 国产精品久久久久久久久久久久午夜片 | 日韩精品视频一区二区三区 | 日日干天天干 | 特级黄色片 | 特级黄色大片 | 美女扒开腿让人桶爽原神 | 亚洲人成在线观看 | 日韩激情网站 | 成人在线精品 | 一级片免费视频 | 亚洲一区二区在线播放 | 日韩精品视频免费播放 | 福利小视频| 亚洲人在线 | 欧美专区第一页 | 日韩国产一区二区三区 | 在线免费av网站 | 欧美国产日韩一区 | 99在线免费视频 | 欧美日韩在线免费 | 久久观看 | 国产免费成人 | 午夜在线观看视频网站 |