找回密码
 注册
关于网站域名变更的通知
查看: 976|回复: 1
打印 上一主题 下一主题

TWEN-ASR ONE 语音识别系列教程(2)— GPIO、ADC、PWM的使用

[复制链接]

该用户从未签到

跳转到指定楼层
1#
发表于 2021-6-18 20:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

EDA365欢迎您登录!

您需要 登录 才可以下载或查看,没有帐号?注册

x
本帖最后由 Heaven_1 于 2021-6-21 09:33 编辑
. m1 {3 e6 A+ H3 U! s* V9 X/ p
- u- P6 ~( K  i- M; m/ xTWEN-ASR ONE 语音识别系列教程(2)— GPIO、ADC、PWM的使用
7 u1 T( i* u5 N7 d提示:作者使用 TWEN-ASR ONE V1.0开发板进行开发学习。
( V/ g- e" H5 ^4 ?; S) `* q( B4 ~+ u6 x: a1 p* N. Q
文章目录
" b$ d6 R$ t5 M# p9 E6 F+ P1 t4 N  Y$ K  ?# |
前言$ s3 i! L& w0 S* ?% s/ l1 ]! Y# c
一、TWEN-ASR ONE GPIO读写操作$ r. A# _% t( U8 C* B" k
1.1 GPIO 使用说明
6 X( b& w8 R* B- j- [1.2 GPIO 代码编写
6 I& q, [7 _8 V1.3 GPIO 代码分析1.4 GPIO 运行测试# N$ J% I1 [- F9 W, M! W) y
1.5 GPIO 使用小结
8 D  m9 b+ H- N二、TWEN-ASR ONE ADC读取操作: ~$ F" ^) `% Y0 r7 r+ o
2.1 ADC 使用说明0 D7 {+ k9 m% [5 Y- N$ l8 l
2.2 ADC 代码编写, G/ T3 n/ A. w$ K0 ~
2.3 ADC 代码分析
* h5 {0 X+ M3 E2 m# u& i8 e2.4 ADC 运行测试
& B+ d- W. [; h- }2.5 ADC 使用小结9 A* |" \* e3 {5 q
三、TWEN-ASR ONE PWM使用- T7 g5 K, m: e0 A
3.1 PWM 使用说明1 F& }+ T0 X3 }. q
3.2 PWM 代码编写; w7 J4 m! I' \- M0 m
3.3 PWM 代码分析
! _$ n& k2 |2 t3.4 PWM 运行测试
5 A3 E  W5 L) c% l$ G0 G3.5 PWM 使用小结& K3 M9 w7 F) [0 _1 |+ Z
四、总结" V: P$ x& P. d1 H: a% a1 h
前言
# y" o% A# Z- S5 W" k8 R
7 \2 P* p+ s5 a    通过《TWEN-ASR 语音识别系列教程(1)—运行第一个程序》文章,我们学习了如何编写一个TWEN-ASR程序、下载程序、调试程序。从上文可知,TWEN-ASR ONE开发板引脚丰富,引脚主要功能有GPIO、ADC、PWM、 UART、IIC、SPI。本文将介绍TWEN-ASR ONE的GPIO、ADC、PWM使用。 主要内容有:% K: K8 L9 m: F5 i
8 Y5 X2 U0 b+ k1 ~
TWEN-ASR GPIO读写操作;
* p2 k8 d/ G5 {/ P  `TWEN-ASR ADC获取当前电压值;) t8 j, N* |, a3 V# n
TWEN-ASR 根据ADC的值,使用PWM调节红灯的亮度。
6 k. x, i: u6 t
一、TWEN-ASR ONE GPIO读写操作6 k# M" o0 K8 t: u

& v9 a$ R9 }& S1 M- S5 E( i1 ^1.1 GPIO 使用说明& b/ u# Q2 p: ]7 Z6 @. v+ @

# ]0 H/ a( r5 \5 h4 v# T  N  f* y    了解GPIO使用前,先了解TWEN-ASR ONE芯片的一些信息,如下图所示芯片引脚信息图。
( n  {) u$ z: R5 H/ P5 K$ b) o' g. s 7 B+ Z6 T9 K; V$ T

- d. p6 @5 j4 `, c4 p5 H图1.1 TWEN-ASR ONE 引脚信息图3 U9 V  ~  |) w/ x1 C
    TWEN-ASR GPIO可支持27个GPIO口(IO功能复用)、每个GPIO口可配置中断功能、支持两路带滤波功能外部中断。因为IO功能复用,所以GPIO工作前需要选择引脚功能。当然如果使用默认的话,可以不设置。 例如P0_0引脚功能[1]如下图1.2 引脚功能描述图所示:0 _* c6 E! D( v7 X/ z
3 ]8 Q: `& O& V2 ~6 ]

' z1 i* C; s8 e图1.2 引脚功能描述图
7 P- p1 y9 g8 B( x) y从上图1.2可以看出,P0_0是芯片的第4引脚,IO口有4mA的驱动能力。默认是输入模式。T+D表示三态下拉。具体的状态定义如下表1.1所示。: c( {5 N( l0 P

) C! j! G/ t: e* D* k; H表1.1 状态定义表
% \1 Z5 q9 q" \( k
, w: F$ I& h8 n/ U
3 f- Y5 R* Y/ Z5 i8 n- o) H" o" p1.2 GPIO 代码编写
, q! k: s/ A$ D! p! i
3 z  O5 D) H4 }2 H    根据前面的分析,如果我们使用P0_0为GPIO的输入输出引脚,需要设定为第一功能引脚。同时根据使用需求,设置为输入或输出模式。' E; m/ ]) l! h; L, O
    (1)P0_0输出模式测试程序。 实现程序主要是通过P0_0输出高低电平,控制灯的亮灭。电路原理图如下:
4 w  k" d* A! \' E& [( q5 k
/ W% w# W) Y, S% a+ J" t
0 E  l; f7 I  L. K* d图1.3 P0_0外接扩展电路图
. \1 T7 p8 O9 n4 ?6 @( q+ V% o其中,高电平红灯灭,低电平红灯亮。 这与官方的板载RGB灯恰好相反。具体代码编写如下:
* O9 g: q' h$ l" p. n% _% C4 d& `$ M7 T
- z& F. z" H3 I  R图形代码:  N  Q! ~# p9 l' j
/ ~' G: |4 q2 \1 p  }0 y4 P1 D8 k( u

, f* V. c7 H, e) a& a' k) Z) t2 y图1.4 P0_0输出模式测试程序图
. n2 R& D9 [% n4 o' l: @: k" J字符代码:
2 _8 P7 m" ?( t4 |2 T7 w" p2 G#include "asr.h"
8 o. v. [7 W' S2 _( e% Y#include "setup.h"
2 W: _. j; O" x; U, n# E% M
7 i, D9 \. z% l) a  j* Cuint32_t snid;
, M' H$ B& ^3 }; \2 Fvoid ASR_CODE();
$ G; s; l) L: z
2 c, L* M% D% @, o8 L//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}
0 ]+ l& F0 O  S1 ]* y//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
2 C! v9 W" K. ]/ A" v//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
" @' C- I9 o+ @8 g& xvoid app(){/ x, I  W3 S( W. E  G! f
  while (1) {
+ X5 I# h0 ]4 Z: Y% Y. p7 {    digitalWrite(0,1);
& B6 t6 u2 t. m. L0 L& p    delay(1000);
5 g4 y0 U! T& w    digitalWrite(0,0);
1 f8 T; P, V' O1 f$ ?    delay(1000);
, Z/ s8 D( Y- j( g/ @$ @4 w  }
) n" h6 N" `! s! p+ tvTaskDelete(NULL);% [9 t. P; K% u
}
' ]5 s: n; G& ?* f/*描述该功能...1 `$ h+ E' M/ b) A5 Q7 v
*/
/ ^0 c6 H- s# s. t4 X$ W' d, }8 M) Vvoid ASR_CODE(){
% h7 P; f- `" a9 [" U, [2 N  if((snid) == 4){; v; z" X' |& F4 c) x
    digitalWrite(13,1);
+ q; w: Y5 E1 |1 {6 c' t- i  }3 `# L: B7 M' m+ |# ~# N
  if((snid) == 6){" ?9 I& Q2 h! C! d
    digitalWrite(13,0);6 c4 n) `5 a0 I1 }3 {
  }8 ^: r2 b* Z& S0 F0 y
}
, H0 W% q/ {  |. y! i9 \0 g+ O3 X3 F+ B  w6 |3 K4 w
void setup()- T9 T9 W4 `: }$ v. j7 T
{
, q4 x7 k# ~7 z$ g4 {" T' b9 e# |  //{speak:小蝶-清新女声,vol:10,speed:10}- ^, x" J0 |, ^& J7 J/ ]6 J6 ~% Q
  //{playid:10001,voice:欢迎使用智能管家,用智能管家唤醒我。}5 d/ ?0 K; n0 G* `3 s) O# m
  //{playid:10002,voice:我退下了,用智能管家唤醒我}
4 m# k6 E! ^* U" I4 ^# h' z  //{ID:2,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}
* d# [5 u0 P% q- X- P2 P. ^  //{ID:4,keyword:"命令词",ASR:"打开红灯",ASRTO:"好的,马上打开红灯"}6 }4 W* y1 S% Z. i8 ~
  //{ID:6,keyword:"命令词",ASR:"关闭红灯",ASRTO:"好的,马上关闭红灯"}
6 J9 K/ R% @2 O" @% W7 _4 O5 C3 A  setPinFun(0,FIRST_FUNCTION);1 g6 h9 l0 Q; h3 s1 j
  pinMode(0,output);
: V& ]$ `2 C# k4 X  xTaskCreate(app,"app",128,NULL,4,NULL);7 j' ?7 I3 P6 o: l" [
+ r6 J# d% i' [: T2 f) ?) p* [
}
) o) }* n% b7 Y- y6 j. J9 d! Q# V0 f7 _8 P: }+ L6 r! b
(2)P0_0输入模式。 实现程序主要是按键按下,P0_0获取到高电平;按键松开,P0_0获取到低电平。 电路原理图如下:
8 L. b9 z1 ?9 K; s, g! W2 _
5 B% A: q! Z% B4 u+ [8 i' M; ?6 o# A+ m* C
7 V2 A# W5 M- v; q) C+ c图1.5 P0_0 按键输入接线图
7 O' U. i( B! x2 v也许有人会疑问为什么KEY1 1引脚接3.3V。因为P0_0默认T+D(三态下拉),即默认P0_0悬空的情况下,读取到的是低电平。 所以KEY1 1引脚接3.3V,当按键KEY1按下时,P0_0读取到高电平,松开按键KEY1读取到低电平。
1 b" E" e; D) E8 o' s% f
. e6 r+ W! o7 R7 j6 J+ ?- u  J图形代码:
0 g% ^) x" F  S5 I$ s/ \ " Z7 w0 W% ^5 h& E: d

+ n; V3 }& g! H8 a2 u5 G图1.6 P0_0输入模式程序图# K/ F1 g# X  r6 {; q( O
字符代码:% M$ t$ d! q! u1 Y, c
#include "asr.h"
8 V4 f9 C% {! y5 K9 l2 ?#include "setup.h"
% B# y5 \! c2 t& X#include "HardwareSerial.h"# m, P8 d5 m# C8 V# P

* [7 X/ m% V3 w+ T5 ?, ~" A# X$ P  Luint32_t snid;/ t7 @+ f2 _+ \3 [
void ASR_CODE();. w' _  R. T: I! U- K6 S" A

2 N1 E0 Y+ U& G/ Y& O//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}' O3 G) \4 @- j! C7 H* u
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}
/ b" f1 K# y! n# l) M7 B3 l//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
# n6 |; |: E* h% d* zvoid app(){
8 k. S! A9 [( t/ W! x- C  while (1) {
/ I- }7 A. ^- M( x4 J    Serial.println((digitalRead(0)));
0 c3 Q3 \% F/ h4 r4 h    delay(1000);& n* M; z+ T8 w
  }$ [; ^7 M* O5 m# e- f5 ]6 q" j6 a
vTaskDelete(NULL);; ?1 U3 E/ j+ {6 `
}
" i) {3 T# B2 |$ X! T( F0 |/*描述该功能...4 }$ p  B2 D; r
*/
0 Y' [, J0 F4 T* f; ^* @+ dvoid ASR_CODE(){1 ]/ Z7 s0 A9 Y, Y' W0 y
  if((snid) == 4){, h* A1 k$ W. r' u. [9 s0 C1 D
    digitalWrite(13,1);
) p0 u- l* m6 U/ R" q0 L1 }. `  }
; P' o1 y$ m0 n  if((snid) == 6){
( W( p+ Y- _2 \3 w) k    digitalWrite(13,0);
+ B3 S- C' x6 n" ^$ z/ W1 t  }
. L8 F$ r- p) u  ~, \}
( E1 ?9 ^: {  |' z3 N' c" t
( w, l/ r3 h, O  E" Hvoid setup()+ C* {7 w1 D- j: _
{
, n: N- O% S3 ]/ U  Serial.begin(9600);
! \: I+ t5 C( V+ }5 g& I6 p" m  //{speak:小蝶-清新女声,vol:10,speed:10}
7 U; y1 P' Y9 Q! |$ S  //{playid:10001,voice:欢迎使用智能管家,用智能管家唤醒我。}
9 j' n: |# j& r. v1 J3 f9 g/ F  //{playid:10002,voice:我退下了,用智能管家唤醒我}: Z+ [( |9 ?0 ?* C
  //{ID:2,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}. `  M# v5 X- h$ v! C1 ]' g/ ^3 Q
  //{ID:4,keyword:"命令词",ASR:"打开红灯",ASRTO:"好的,马上打开红灯"}
* C! o& |( r/ |& ?% ^  //{ID:6,keyword:"命令词",ASR:"关闭红灯",ASRTO:"好的,马上关闭红灯"}
2 h( ^" j4 R7 N! z  z3 o2 o9 V4 Q  setPinFun(0,FIRST_FUNCTION);+ H' \) S4 \3 {% H1 t7 j5 N
  pinMode(0,input);
# Z7 I# ], m- {5 m! r2 G+ p  xTaskCreate(app,"app",128,NULL,4,NULL);6 k2 y- ^0 w' q& D
4 p1 i2 q; H( D$ H. N% B
}9 o7 c) F5 U2 E
/ A$ N; g, h, N& ]+ [: `- E0 m( F
1.3 GPIO 代码分析
% I& S4 H0 i$ |: R2 }4 l8 `% h1 A# h) _6 V
    如果上面的代码含义明白可以跳过【1.3节代码分析】。不太清楚,可以参考下面的代码分析。
* B! G- }/ r" X, I/ }; N/ E
, W3 u6 F! E0 U9 v! z    (1)P0_0输出模式测试程序分析。
" [: }$ ~$ Y+ k$ b8 V7 p% J6 u7 l1 B  A; V
初始化:
% B6 A) K% E6 z1 U3 g设置引脚功能为第一引脚功能;
# x8 r$ h, M8 B# [: U' F" Z5 u设置输出模式。: V* a. ~9 X# M" Y  D
线程中写操作:
& d: V5 L2 P8 J: s  O: K2 }" W$ v使用写引脚块,可设置为高,低电平。( J2 R- a' }( \2 M
在线程中,重复执行P0_0高电平,低电平。中间延时一秒钟。关键代码注释如下:
8 l2 p# G- r. X, O * S4 s0 P  b! ]% K* u

/ L# d6 Q, M7 P1 P! u, g/ B0 K; P% G2 q! `4 h: ^1 j) e
图1.7 P0_0输出模式程序注释图& _9 Y  W0 E9 g8 z- ~, C
    (2)P0_0输入模式测试程序分析。
4 E2 A1 D- @' Q  B6 A" F9 P! _$ A$ R7 Y
初始化:+ `7 ^+ K0 F1 Y

% T( S( f( Q5 t* W! f9 @  K. p设置串口0波特率为9600;
# z5 ]6 x+ ^+ ^- s) e) e设置引脚功能为第一引脚功能;. l& H1 P! ^6 }: L! L; ]
设置输入模式。
5 d- [0 h/ Q2 T+ y: s' X+ ~  l线程中读操作:
( ]1 H( ]8 `1 ^; U, i% C' K* b$ s8 l
使用读引脚块,读取的内容通过串口打印出来。
' ~. O, C/ @0 h- l+ Z在线程中,每秒钟读取P0_0状态,并通过串口打印出来。关键代码注释如下:  c  Z/ _( ~0 C+ g! X+ `
4 V. j3 ]' n& ]! z8 c$ j1 {* R- N( H
7 ?7 v" ^7 a& z3 G) T7 W
图1.8 P0_0输入模式程序注释图$ A7 F0 P0 ~3 ?) x* c# V- i% K3 p
1.4 GPIO 运行测试* @6 t9 Z4 G! G0 T% q" e9 S; Z

& I! _9 y& ?- I1 N0 F+ y    (1)P0_0输出模式程序运行测试。 红灯闪烁,红灯每间隔一秒亮或灭。输出高电平红灯灭,输出高电平红灯亮。+ U3 a' p$ b1 S- _+ `% {6 N) ?2 r
. u* f$ H" R! P) J5 ~. ]

7 c- G! C( Z- K, j% g图1.9 P0_0输出高电平红灯灭
' G% [9 I3 w& X) \
# S% x2 T1 Q$ e3 a4 ]' h) p1 r. K

/ k3 p6 i8 c) v& K' r! |! W图1.10 P0_0输出低电平红灯亮. {$ P6 d) S" }0 [# G8 C& U# X
    (2)P0_0输入模式程序运行测试。 当松开按键读取到低电平,当按键按下时,P0_0读取到高电平。具体测试结果如下图所示。; w  _4 C5 C9 [6 u8 a

9 ^# u) @" p* a8 v) y+ |
  f, @- y5 A% q  {$ Y. j图1.11 P0_0输入模式松开按键
# f2 ~9 x6 L3 ^3 l. d* H
! v5 ~1 f7 ~8 I * ^! O& e+ s$ ^! ^' W  p* c
图1.12 P0_0输入模式按下按键( H) O0 \' @# i- V: [
1.5 GPIO 使用小结
, w" b& j4 O& t* ?6 s& j
6 `& I* U0 h& L$ c4 X' T( \8 ^    GPIO的使用,一般需要设置功能引脚,设置输入输出模式,输入模式对应读取引脚状态,输出模式对应输出高或低电平。实际使用设置功能引脚需要查看芯片引脚功能描述。而输入或输出模式则需要根据实际使用情况设置。1 S4 T! N. z) C# v& F" P

; X9 _' }; m: ^* r! [! h0 C二、TWEN-ASR ONE ADC读取操作9 b0 }& s5 d! B+ \

% |8 I- m' |' e& C$ l( e2.1 ADC 使用说明
8 q; g% q# |6 Q+ ]* `* @% j  Z7 Y. ?
    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无需另外设置功能引脚。
# R- k: _; V' p7 H4 l
5 S0 R8 Q  {& w, s
2.2 ADC 代码编写
# ~3 {; u# z' w, G. N
$ z3 Q# h- Z* }3 K* X# i! e- B& P    实现程序主要是读取AIN0数值,并进行电压换算,最后用串口打印电压值。 关于电压的换算,由于TWEN-ASR是12位的ADC,那么读取的范围0 ~(212 - 1),即0 ~ 4095。0对应电压为0V,4095对应3.3V(参考电压)。读取数值和电压是线性关系,换算公式1如下:
2 v3 s8 y- i- ]8 d9 x
" B( o! J* {& m- M, \1 l) e8 vU = V a l 4095 ∗ 3.3 v U=\frac{Val}{4095}*3.3v
, g" b/ k' y. H! k; h5 uU= ; l- ]& C. N. ?. u( V6 z
4095
  q& H4 R% a, H# F9 WVal6 B) h* {/ y+ u5 S) b- ]
​        " d+ ~# K3 L- x: I1 ^
∗3.3v
: F% ^" ?/ z7 B5 I2 m: {
1 X3 h5 V, F: O5 Q8 Y$ F7 Q; i--- 公式1
3 [1 ~9 E- h0 K- m0 N: h4 V
/ H  c9 }% m$ W; W& L* R! n其中, V a l Val Val是读取的ADC值, U U U是换算出来的电压值。测试ADC将会使用滑动电位器, 测试电路原理如下图2.1所示:) f  X* a( G% p' ~  w" T

$ ~* B1 ^. _2 H, P* K1 p% o/ _
  A4 D0 U# W: {- U/ f! v! T6 Y图2.1 ADC测试接线图1 [4 p& u+ w+ {% I* j$ h+ C0 ]4 A
其中,P0_0对应AIN0,滑到最左边电压为3.3V,滑到最右边电压为0V。/ j5 A- e: R# ~2 R) E  ~6 z
! X! K8 \3 m7 k+ G. }
图形代码:  @: q( v9 h, v4 h% b2 A( u
: H. K& d( P: h1 q/ {0 s
# @4 ?- {, j  m
图2.2 ADC测试程序图
$ k, Z2 m# z9 }; y% C( |字符代码:
' P/ R+ f/ ~7 ~$ d6 ~. R#include "asr.h"
$ D6 E# W5 c; t) Q2 b#include "setup.h"3 R. v0 _: J/ Q
#include "HardwareSerial.h"0 r, v8 z" h6 V3 o& Z. A, \
9 ^0 @0 M7 i, V1 I% ^% O& @0 O7 E
uint32_t snid;
' H" _4 C5 Z/ f" y: dfloat res = 0;
8 x4 t6 B% g/ G  A1 n) yvoid ASR_CODE();
2 d" x+ k5 K; G+ Z; z3 x; K8 }, Y5 R
. O) E9 M! |3 r! A. H2 T//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}6 R6 V$ f% Q8 u  {) E
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}0 i7 n- _' Q/ H8 L4 n/ T1 l" [
//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}7 n1 k" ^8 D' C/ I5 U( v5 b
void app(){
4 P% ]4 C- d2 ^* p  while (1) {( `0 l5 A  Y: `! U
    Serial.print("U=");
! h2 g, r% l! R, ~# d$ |4 U# _    Serial.print(((adc_read(0) / 4096.0) * 3.3));4 Y# C& g5 z6 r% @
    Serial.println("V");
4 i* n$ `, e  _0 h+ Z    delay(1000);
4 |; S& o" q( y. k& L& m  }
4 A" i* ]( e/ R5 I. E- evTaskDelete(NULL);' S; d4 z+ D# W0 V# F
}( ^' ~) E( g: k7 I! E
/*描述该功能...; k7 }- q/ a, ^
*/
; m- A* v6 H  C$ h1 Cvoid ASR_CODE(){
3 P- s/ j$ ?8 ?& d3 `  switch (snid) {9 J1 E+ L- c9 _2 ?* f
   case 4:: o; G# U  K7 s% c- m$ U
    digitalWrite(13,1);; |) G8 F! j# w4 M
    break;
2 G3 r# C5 ~6 j* z: Z2 T- v9 o1 j   case 6:# |( W0 x, r& E6 ]3 v
    digitalWrite(13,0);) z0 J! e* P+ u/ e* T0 ^6 L6 N
    break;
& w( i" {9 t3 g0 ~! F! c0 L; v  }8 }$ V8 R0 ^. h8 G, i
}
- K$ D& E' V( W1 v4 T6 c' T) r5 ]6 o  m8 c8 S/ \( e" P: H# m5 X3 b3 {
void setup(). G6 [6 t/ r& `/ i' Y* n
{
$ F$ p$ K" F7 T  Serial.begin(9600);
+ w  ^4 f8 m$ @. h) s& V3 r8 t  //{speak:小蝶-清新女声,vol:10,speed:10}/ P7 Z0 D' k: G
  //{playid:10001,voice:欢迎使用智能管家,用智能管家唤醒我。}( N# C8 b6 Y/ g" [5 S, B
  //{playid:10002,voice:我退下了,用智能管家唤醒我}
( P# K# |% ~; y" ~  //{ID:2,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}
. N0 C% p3 G) Y* Q$ {0 `* O  //{ID:4,keyword:"命令词",ASR:"打开红灯",ASRTO:"好的,马上打开红灯"}; \# Y( o# ?8 k0 {. o: @9 K
  //{ID:6,keyword:"命令词",ASR:"关闭红灯",ASRTO:"好的,马上关闭红灯"}1 N; V0 Z! J" D% A4 ^- ~
  xTaskCreate(app,"app",128,NULL,4,NULL);
- g$ c6 q% x& R) s
5 ?( M  q$ o2 }' g. G}1 B) E5 H7 e! r3 ^, c+ N+ ^
# q  m8 u: U* u4 K2 \
$ I- _8 A' S5 `6 D
2.3 ADC 代码分析
8 A9 z, p5 i* `+ a; r; R: M; r6 F: q3 d. b1 u5 x7 i
    如果上面的代码含义明白可以跳过【2.3 ADC 代码分析】。不太清楚,可以参考下面的代码分析。( B- D% A5 C* o/ L5 q9 Z4 O
    P0_0引脚默认是ADC功能引脚,所以不需要设置功能引脚。 在线程app里面,"读入ADC值AN0"就是读取AIN0的值,并根据公式1进行电压换算。3 t( x$ }* E3 `- t7 L6 ^- D

5 }; k2 ^$ ^; [
; P/ m- i: z- I" i0 q图2.3 ADC测试程序注释图
3 O0 \& V0 W/ N# w3 P0 P- R2.4 ADC 运行测试( g/ v0 ^0 y, c% R- x) d9 ~* b
5 O" U+ M1 _2 l7 ~
    程序下载完后,打开串口监视器。
, \4 C/ t# s9 t2 \6 C, ]/ i  D
6 n1 H; D- i7 M3 {图2.4 万用表与串口打印数据比较(1)图

7 P, y$ H- {8 R& K9 y9 h3 s由上图可知,串口打印出U=3.3 V,而实际万用表测出来是3.608V,误差有0.308V左右。因为参考电压选用了3.3V,而实际是3.608V。当我再次测量ASR-ONE 3.3V引脚时,实测电压为3.637V。所以修改程序为:& a5 ~0 W0 X# P% Y" x

6 `. R4 N( w9 i$ ^& g
. p+ P3 s# D% g图2.5 根据实测3.3V引脚电压,修改程序图1 Y: h0 x/ o$ R8 y6 E6 [
调节滑动电位器,到最左端。万用表实测电压为3.640V,串口输出为3.63V或3.64V。可见经过修改参考值后,数据与万用表接近。
) u7 N' d4 d( |& ]: X4 F- \. o0 f
+ R' q8 a# E$ B4 b1 G: A. h) k' d  y' R. i2 _7 q8 o! T
图2.6 万用表与串口打印数据比较(2)图* r: E0 b/ w; \# h1 {: `+ V# ~
再次调节滑动电位器。万用表实测电压为2.275V,串口输出为2.27、2.28、2.29V。可见数据与万用表接近。误差还是很小的,在接受范围内。6 r3 d5 j0 ~8 z5 O3 D
. U% N5 T+ I+ A3 v
( |. f8 w, X/ `9 F) T0 Z
图2.7 万用表与串口打印数据比较(3)图2 R; {  {' y  ?" D  ^9 m
2.5 ADC 使用小结
  G5 e- e; e! y3 n: ]* v( G* Y7 H4 R1 `" R4 F7 A! q7 s
     ADC 使用不需要设置功能引脚,因为默认就是ADC功能。ADC 引脚分别是AIN0~AIN3,对应是P0_0 ~P0_3。本文使用P0_0进行测试,可见ADC使用,需要对参考电压的修正,才能准确测量出电压值。当然如果使用稳压管的电压作为参考电压,这样就不用修正。或者ASR-ONE是否有内部的基准电压可用。想要用好ASR-ONE的ADC还需要对芯片更多的了解。
/ J9 C; H9 j% x  _) O' b9 c9 t% ~) ]2 J4 L- d, F
三、TWEN-ASR ONE PWM使用
2 p- b  ?: B& R& h, B2 A' g( j' r5 X1 N8 i/ u+ e
3.1 PWM 使用说明
& C4 V$ r1 Y8 O; a1 q, z& m0 ?" [) B, \* M7 q9 q
    WM,英文名Pulse Width Modulation,是脉冲宽度调制缩写,它是通过对一系列脉冲的宽度进行调制,等效出所需要的波形(包含形状以及幅值),对模拟信号电平进行数字编码,也就是说通过调节占空比的变化来调节信号、能量等的变化,占空比就是指在一个周期内,信号处于高电平的时间占据整个信号周期的百分比,例如方波的占空比就是50%[2]。7 G+ Y& T3 e3 R* N! o0 @4 y1 I

( y/ h- J: J+ Q3 {! u: l6 _( Y6 ?: P" f  Q3 \
图3.1 PWM占空比示意图$ R! z; S) E+ f' R6 ^% @/ g% O
    在天问Block软件中,有两个PWM相关的块。使用PWM只需要进行PWM初始化,设置占空比、初始值、调整占空比。
( I  o: b( ]$ U% h: f
2 m1 M1 e8 u. F7 C8 J
5 x# J. U, j7 o图3.2 天问Block PWM相关块7 k0 |% c- E% D9 p6 J4 T
3.2 PWM 代码编写
  g6 R8 k& n: M0 {: o1 g+ V
7 m% Q* r: ^  j4 Y8 P7 F1 A    实现程序主要是读取AIN0数值,根据读到的数值,调节板载RGB灯的绿灯的亮度,值越大亮度越大,反之,亮度越小。 RGB灯的电路原理图如下所示:, H4 }$ g' v' I# B' ~. U5 Q
* H8 `% d$ c& e( d

" d+ v+ ^+ R2 O% X# {9 k+ D图3.3 RGB灯电路原理图
) _  a# _6 y4 V7 j( H/ M5 L其中,PWM5是控制绿灯。
. [( K! l+ k* v
9 I+ F2 g& c9 i# n- V& V3 P1 e1 c9 h  n
图形代码:1 w6 @& H! X/ L# B# d
% G7 L& J6 P1 V; |
图3.4 PWM测试程序图
. u) }8 S# S* P5 T字符代码:
* i1 q2 c. \2 ?9 N% p4 I#include "asr.h"4 b2 x  V3 e' u9 |3 I4 Z8 ]7 w
#include "setup.h"
* U. f+ n2 V; l' i% k: z. T
3 ?( U/ N) V* ~9 @: \) W$ `uint32_t snid;" `1 r" L' |  G2 \3 r2 i
void ASR_CODE();
. ]& u1 v4 m/ l7 h. X2 [% x5 v) _) u) Y/ O" q  l( V
//{ID:250,keyword:"命令词",ASR:"最大音量",ASRTO:"音量调整到最大"}- s, w* O8 X- @/ G* A6 H4 s1 e3 k
//{ID:251,keyword:"命令词",ASR:"中等音量",ASRTO:"音量调整到中等"}' C: e- R4 J  o  v
//{ID:252,keyword:"命令词",ASR:"最小音量",ASRTO:"音量调整到最小"}
& E6 e: \9 m* Y7 A2 B3 ^9 k) avoid app(){
$ n$ m4 J1 d! [# \/ E  while (1) {
* K. \) {1 k: f2 s  E" Q( N" w    pwm_set_duty(PWM5,adc_read(0),0x1000);- Y( Y3 I) B5 L1 ], Z& L& c
    delay(50);
4 ]; J. ^( g: }/ k) w  }9 ?% t6 x/ c+ p2 a8 D3 n
vTaskDelete(NULL);
, u) M+ w. C- U3 f  C}1 w6 s' i& S" c0 {. F, {& j
/*描述该功能...
; o# u: X9 }1 N5 D+ N6 e0 L*/5 o% x$ c5 k9 i; Y
void ASR_CODE(){
) B$ G# m" M) l2 Y9 M* v  if((snid) == 4){  y) M" b; X; S5 j
    digitalWrite(13,1);- b& P# e/ s4 M+ e7 X
  }7 ]& B4 v" ?6 b+ Z
  if((snid) == 6){7 I% E+ |( Y* h' P0 t1 ?2 t
    digitalWrite(13,0);$ P  a% @, B' u  f$ A9 n9 e
  }
) h( U  c. c9 H/ x6 r+ l}
8 j8 Y4 O3 f1 Y3 ?
6 _8 @" C8 [! @! K5 u) hvoid setup()
& U+ h6 m( J8 W3 Q5 g6 U{
8 V0 V! x9 R' ~8 @  //{speak:小蝶-清新女声,vol:10,speed:10}
0 f) U7 }* f4 l" R  Y  J3 {, I) o  //{playid:10001,voice:欢迎使用智能管家,用智能管家唤醒我。}& H1 o  @8 c2 I; p  ^3 |5 e9 N
  //{playid:10002,voice:我退下了,用智能管家唤醒我}
9 `# V! }5 N3 v8 @$ _  //{ID:2,keyword:"唤醒词",ASR:"智能管家",ASRTO:"我在"}
( Y: F: e& G8 _  v, J  //{ID:4,keyword:"命令词",ASR:"打开红灯",ASRTO:"好的,马上打开红灯"}
6 a( ^6 d9 d7 F* k0 v4 I( a  //{ID:6,keyword:"命令词",ASR:"关闭红灯",ASRTO:"好的,马上关闭红灯"}0 x% r5 O' t' K) I+ I% o
  setPinFun(14,SECOND_FUNCTION);. q! T2 x7 c' n- s& D' x
  PWM_enble(PWM5,1000,0x1000,0x000);
% A& i3 }8 d6 D8 f% M! ?/ T  pwm_set_duty(PWM5,adc_read(0),0x1000);, c4 F* d) _& M$ ^. v; R7 Z
  xTaskCreate(app,"app",128,NULL,4,NULL);
0 L- U5 b6 C2 M! H& x. j, h/ g" b+ t
: {; L' b4 i5 M}
$ f) o" R0 u' P  I9 X5 b, g
6 k' Y; ]8 X! K& ^9 n  ~3.3 PWM 代码分析5 @2 ?7 T  [: f/ R
. e) |4 D, k! X- |% g0 W  ^' u
    如果上面的代码含义明白可以跳过【3.3 PWM 代码分析】。不太清楚,可以参考下面的代码分析。
: h7 R& I1 \. H# V0 |PWM 频率设置为1000,最大占空比为0x1000。这么设置是因为ADC最大值为0xFFF。  S( z  d8 [6 X3 O6 Q# k+ V' I" s
* [, i+ G' y: x2 N2 N

/ N# n# K) A. l8 O图3.5 PWM测试程序注释图  J2 v! y2 `, k
3.4 PWM 运行测试
( q4 l' w2 N' F7 b# H8 ^( k% Q5 z; T
    调节电位器的大小。AIN0读到值大时,灯会比较亮。如下图所示:: O2 K' S5 |% C. F& v% s$ t
0 S8 T% F+ F* e. o! O1 @9 o

3 ~4 ~% A3 d$ {6 Q0 z0 ]. _9 Y) V图3.6 ADC数值较大时( p. ?) b/ Y5 n5 y4 }
    AIN0读到值小时,灯会比较暗。如下图所示:  j$ {0 v1 h# [5 R2 A5 g! ^

; G) b1 L( D/ T) @% v: t9 }% M / f8 ~# @) G8 b

4 w  ?- h- [; Q0 D+ j$ X- H  h图3.7 ADC数值较小时
9 L( ~, \( ^- K. i+ M改变PWM占空比,相当于改变PWM5引脚的电压值,从而达到调节亮度的目的。1 ~' [, O/ \) }( D

- c( {3 }7 G( I# u% x$ Z7 _3.5 PWM 使用小结
8 i/ Y( n5 w7 E3 a) F% U
" l6 }9 K) S7 x6 t, G3 W4 H% L    在天问Block软件里面,PWM使用非常便捷,设置频率,设置占空比。PWM块有PWM0~PWM5可以使用。PWM在控制直流电机速度、LED灯亮度等等场合应用比较多,使用ASR-ONE可以快速的实现想要的效果。# \5 S1 }2 `% g9 i; c/ l

) h: x  v3 z6 h6 D' S7 K6 U* @四、总结
0 ^( V# J4 f* k# c

% L0 s# t5 P9 U1 M6 s8 K* ^    本文介绍TWEN-ASR ONE的GPIO、ADC、PWM使用。GPIO使用,设置功能引脚,设置为输入输出模式。ADC使用,需要注意参考电压,12位ADC的数值范围为0~4095。PWM使用,设置频率,占空比。TWEN-ASR-ONE总体来说,不管GPIO、ADC、PWM编程实现非常方便,有很多块可以使用。) w: W  }# {  e2 E5 o1 p
————————————————
0 M1 ^, y6 a: @
0 {( x! g) a7 U& t0 d' P

该用户从未签到

2#
发表于 2021-6-22 18:48 | 只看该作者
GPIO、ADC、PWM的使用
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

推荐内容上一条 /1 下一条

EDA365公众号

关于我们|手机版|EDA365电子论坛网 ( 粤ICP备18020198号-1 )

GMT+8, 2025-8-20 17:48 , Processed in 0.140625 second(s), 23 queries , Gzip On.

深圳市墨知创新科技有限公司

地址:深圳市南山区科技生态园2栋A座805 电话:19926409050

快速回复 返回顶部 返回列表