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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2172|回復: 0
打印 上一主題 下一主題
收起左側

TWEN-ASR ONE 語音識別系列教程(2)— GPIO、ADC、PWM的使用

[復制鏈接]
跳轉到指定樓層
樓主
ID:924491 發表于 2021-6-18 19:24 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
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

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 91网站视频在线观看 | 成人一区二区三区 | 中文字幕亚洲视频 | 久久精品二区 | 国产成人精品午夜 | 国产一区免费 | 国产精品视频一二三区 | 国产精品视频免费看 | 在线亚洲人成电影网站色www | 亚洲乱码国产乱码精品精98午夜 | 水蜜桃久久夜色精品一区 | 久久久影院| 国产精品视频999 | 国产农村妇女精品一二区 | 欧美一区2区三区4区公司二百 | 狠狠操狠狠干 | 三级成人在线观看 | 欧美成人h版在线观看 | 免费在线观看av | 日韩av第一页 | 日韩国产在线 | 999久久久免费精品国产 | 欧美一区二区三区免费在线观看 | 欧美aaaaa | 在线一区二区三区 | 在线观看国产三级 | 久久久久久综合 | 97精品一区二区 | 久久精品免费 | 国产高清一区二区三区 | 欧美福利网站 | 欧美成人精品在线 | 国产精品久久久久久久久免费丝袜 | 欧美成年人 | 国产一区二区三区 | 亚洲美女一区 | 欧美激情精品久久久久久变态 | 丁香婷婷综合激情五月色 | 天天操夜夜操 | 日韩视频免费看 | 国产高清毛片 |