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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 2067|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

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

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

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

使用道具 舉報

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

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 人人人人爽 | 在线视频日韩精品 | 日韩精品中文字幕一区二区三区 | av网站免费看 | 国产精品九九视频 | 亚洲视频中文字幕 | 九九亚洲 | 国产精品亚洲一区 | 香蕉视频黄色 | 精品免费视频 | 久久99国产精品久久99果冻传媒 | 欧美日韩亚洲三区 | 精品一区二区av | 国产精品精品久久久 | 草久久| 中文字幕免费视频 | 成年人在线观看视频 | 国产在线一区二 | 日本天堂视频在线观看 | 精品国产乱码一区二区三区 | 亚洲国产成人在线视频 | 成人自拍视频 | 日韩精品在线一区二区 | 久久精品国产一区 | 欧美一区久久 | 精品免费国产一区二区三区四区 | 亚洲久久久 | 在线看亚洲| 久久久夜色精品亚洲 | 欧美极品在线 | 国产免费观看一级国产 | 国产高清视频在线观看 | 色婷婷综合成人av | 亚洲精品无人区 | 自拍偷拍一区二区三区 | 国产91中文 | 久久精彩视频 | 中文字幕日韩欧美一区二区三区 | 91在线观| 亚洲一区二区视频 | 爱草在线|