踏入DTMF信号生成的世界,我们将揭示创造移动通信系统中至关重要的双音多频信号的魔力所在。
A
A
硬件概览
它是如何工作的?
DTMF Generator Click基于Holtek Semiconductor的HT9200A,这是一款用于移动通信系统的双音多频解码器。HT9200A是一款专为MCU接口设计的SMD音调发生器IC。它可以由MCU指示,在DTMF引脚上生成16个双音和八个单音,并提供串行模式。HT9200A的系统振荡器由芯片上的反相器、偏置电阻和所需的负载电容器组成。振荡器功能通过连接到HT9200A的X1和X2引脚的标准3.579545MHz晶体实现。HT9200A的操作基于从mikroBUS™到解码器DAT和CLK引脚馈送的GPIO信号。基于所选的期望输出频率,数字代码与音频输出频率之间存在连接。HT9200A采
用数据输入、5位代码和同步时钟来传输DTMF信号。通过一系列由5位数据组成的组合来选择传输数字的每个数字。HT9200A将在CLK引脚的下降沿上锁定数据,并将输出数据显示在其输出DTMF引脚上。然后,通过一个可调节电位器,这样的信号被发送到一个音频放大器,来自德州仪器的LM386,它是一款可以用于各种应用的单声道低电压放大器。在音频放大器之后,所需的声音可以在板载扬声器上检测到。DTMF Generator Click使用mikroBUS™插座上标记为CE、DAT和CLK的CS、RST和PWM引脚的三个GPIO引脚与MCU通信。CE引脚表示芯片使能功能,用于唤醒HT9200A,
而DAT和CLK引脚表示数据输入和同步时钟输入。它还具有一个标记为VOLUME的可调电位器,用于调节信号的音量。它还具有一个3.5mm插孔输出连接器,允许用户以自己的方式在他们的项目中使用输出的DTMF信号,而信号音量仍然可以在DTMF Generator Click上的VOLUME电位器上调节。此Click board™可以通过VCC SEL跳线选择3.3V或5V逻辑电压电平操作。这样,既能支持3.3V又能支持5V的MCU都可以正确使用通信线。此外,此Click board™配备了一个包含易于使用的功能和示例代码的库,可用作进一步开发的参考。
功能概述
开发板
Flip&Click PIC32MZ 是一款紧凑型开发板,设计为一套完整的解决方案,它将 Click 板™的灵活性带给您喜爱的微控制器,使其成为实现您想法的完美入门套件。它配备了一款板载 32 位 PIC32MZ 微控制器,Microchip 的 PIC32MZ2048EFH100,四个 mikroBUS™ 插槽用于 Click 板™连接,两个 USB 连接器,LED 指示灯,按钮,调试器/程序员连接器,以及两个与 Arduino-UNO 引脚兼容的头部。得益于创
新的制造技术,它允许您快速构建具有独特功能和特性的小工具。Flip&Click PIC32MZ 开发套件的每个部分都包含了使同一板块运行最高效的必要组件。此外,还可以选择 Flip&Click PIC32MZ 的编程方式,使用 chipKIT 引导程序(Arduino 风格的开发环境)或我们的 USB HID 引导程序,使用 mikroC、mikroBasic 和 mikroPascal for PIC32。该套件包括一个通过 USB 类型-C(USB-C)连接器的干净且调
节过的电源供应模块。所有 mikroBUS™ 本身支持的 通信方法都在这块板上,包括已经建立良好的 mikroBUS™ 插槽、用户可配置的按钮和 LED 指示灯。Flip&Click PIC32MZ 开发套件允许您在几分钟内创建新的应用程序。它由 Mikroe 软件工具原生支持,得益于大量不同的 Click 板™(超过一千块板),其数量每天都在增长,它涵盖了原型制作的许多方面。
微控制器概述
MCU卡片 / MCU
建筑
PIC32
MCU 内存 (KB)
2048
硅供应商
Microchip
引脚数
100
RAM (字节)
524288
使用的MCU引脚
mikroBUS™映射器
“仔细看看!”
Click board™ 原理图
一步一步来
项目组装
实时跟踪您的结果
通过调试模式的应用程序输出
1. 一旦代码示例加载完成,按下 "DEBUG" 按钮将启动构建过程,并将其编程到创建的设置上,然后进入调试模式。
2. 编程完成后,IDE 中将出现一个带有各种操作按钮的标题。点击绿色的 "PLAY" 按钮开始读取通过 Click board™ 获得的结果。获得的结果将在 "Application Output" 标签中显示。
软件支持
库描述
该库包含 DTMF Generator Click 驱动程序的 API。
关键功能:
dtmfgenerator_set_dat
- 设置数据(RST)引脚状态函数dtmfgenerator_power_on
- 打开电源函数dtmfgenerator_transmit_out_tone
- 发送所需音调的持续时间函数
开源
代码示例
这个示例可以在 NECTO Studio 中找到。欢迎下载代码,或者您也可以复制下面的代码。
/*!
* @file main.c
* @brief DTMF Generator Click Example.
*
* # Description
* This is an example which demonstrates the use of DTMF Generator Click board.
*
* The demo application is composed of two sections :
*
* ## Application Init
* Initialization driver enables - GPIO,
* run the power-on sequence, also write log.
*
* ## Application Task
* DTMF Generator click board DTMF generator transmits the signal
* for generating tone for digits :
* "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
* "A", "B", "C", "D", "*" and "#".
* All data logs write on USB uart changes.
*
* @author Stefan Ilic
*
*/
#include "board.h"
#include "log.h"
#include "dtmfgenerator.h"
static dtmfgenerator_t dtmfgenerator; /**< DTMF Generator Click driver object. */
static log_t logger; /**< Logger object. */
static uint16_t signal_duration = 500;
void application_init ( void ) {
log_cfg_t log_cfg; /**< Logger config object. */
dtmfgenerator_cfg_t dtmfgenerator_cfg; /**< Click config object. */
/**
* Logger initialization.
* Default baud rate: 115200
* Default log level: LOG_LEVEL_DEBUG
* @note If USB_UART_RX and USB_UART_TX
* are defined as HAL_PIN_NC, you will
* need to define them manually for log to work.
* See @b LOG_MAP_USB_UART macro definition for detailed explanation.
*/
LOG_MAP_USB_UART( log_cfg );
log_init( &logger, &log_cfg );
log_info( &logger, " Application Init " );
// Click initialization.
dtmfgenerator_cfg_setup( &dtmfgenerator_cfg );
DTMFGENERATOR_MAP_MIKROBUS( dtmfgenerator_cfg, MIKROBUS_1 );
if ( DIGITAL_OUT_UNSUPPORTED_PIN == dtmfgenerator_init( &dtmfgenerator, &dtmfgenerator_cfg ) ) {
log_error( &logger, " Application Init Error. " );
log_info( &logger, " Please, run program again... " );
for ( ; ; );
}
log_printf( &logger, " Powering on device \r\n" );
log_printf( &logger, "--------------------\r\n" );
dtmfgenerator_power_on( &dtmfgenerator );
Delay_ms( 1000 );
log_info( &logger, " Application Task " );
}
void application_task ( void ) {
log_printf( &logger, " TONE '0' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_0, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '1' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_1, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '2' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_2, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '3' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_3, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '4' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_4, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '5' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_5, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '6' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_6, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '7' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_7, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '8' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_8, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '9' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_9, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE 'A' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_A, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE 'B' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_B, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE 'C' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_C, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE 'D' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_D, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '*' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_ASTERISK, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
log_printf( &logger, " TONE '#' \r\n");
log_printf( &logger, "---------------\r\n" );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_HASH, signal_duration );
dtmfgenerator_transmit_out_tone( &dtmfgenerator, DTMFGENERATOR_OUT_TONE_STOP, signal_duration );
}
void main ( void ) {
application_init( );
for ( ; ; ) {
application_task( );
}
}
// ------------------------------------------------------------------------ END