中级
30 分钟

使用Si4731和PIC18F57Q43探索您喜爱的旋律

从AM的深情节拍到FM的活力曲调

AM/FM Click with Curiosity Nano with PIC18F57Q43

已发布 6月 24, 2024

点击板

AM/FM Click

开发板

Curiosity Nano with PIC18F57Q43

编译器

NECTO Studio

微控制器单元

PIC18F57Q43

沉浸在声音的交响乐中,我们的收音机接收器打开了电波,将丰富的AM和FM音乐直接带到您的耳中。

A

A

硬件概览

它是如何工作的?

AM/FM Click基于Si4731,这是一款来自Silicon Labs的数字CMOS AM/FM收音机接收IC,它集成了从天线输入到数字音频输出的完整广播调谐器和接收功能。Si4731的音频信号通过Texas Instruments的LM4910 - 一个输出无电容立体声35mW耳机放大器,传送到板上的迷你3.5毫米母插孔。这样,用户可以直接将耳机插入Click板™,无需任何外部放大器。Si4731 IC利用Silicon Labs经验证的数字低中频(IF)架构,为消费电子应用提供具有高TDMA噪声免疫性、优越的广播性能和高保真音频功率放大功能的经济

高效的数字音频平台。音频信号经过处理以具有最佳动态特性。集成的DSP还处理信号的立体声MPX编码和FM调制。低级数字中频(IF)信号被滤除并发送到输出,通过高分辨率模数转换器(ADC)放大、滤波和数字化。这种先进的架构使Si4731能够进行信道选择、FM解调和立体声音频处理,达到比传统模拟架构更优越的性能。该Click设计用于通过I2C/双线控制接口进行通信。在选择双线模式时,SCLK引脚在RST引脚上升沿期间应保持在高电平,并保持高电平直到第一个启动条件之后。此外,在RST引脚上

升沿前的300nS内不得发生启动条件。双线总线模式仅使用SCL和SDA引脚进行通信。Si4731 IC具有接收信号测量能力。用于广播信号的天线也可以用于接受接收设备发送的信号。虽然它可以同时用于接收和发送信号,但天线不能同时在两种模式下工作。这一特性在校准Click板的发射功率时非常有用。此Click板™只能在3.3V逻辑电压级别下操作。在使用具有不同逻辑级别的MCU之前,必须进行适当的逻辑电压级别转换。此外,它配备了一个包含函数和示例代码的库,可以作为进一步开发的参考。

AM/FM Click hardware overview image

功能概述

开发板

PIC18F57Q43 Curiosity Nano 评估套件是一款尖端的硬件平台,旨在评估 PIC18-Q43 系列内的微控制器。其设计的核心是包含了功能强大的 PIC18F57Q43 微控制器(MCU),提供先进的功能和稳健的性能。这个评估套件的关键特点包括一个黄 色用户 LED 和一个响应灵敏的机械用户开关,提供无

缝的交互和测试。为一个 32.768kHz 水晶振荡器足迹提供支持,确保精准的定时能力。套件内置的调试器拥有一个绿色电源和状态 LED,使编程和调试变得直观高效。此外,增强其实用性的还有虚拟串行端口 (CDC)和一个调试 GPIO 通道(DGI GPIO),提供广泛的连接选项。该套件通过 USB 供电,拥有由

 MIC5353 LDO 调节器提供支持的可调目标电压功能,确保在 1.8V 至 5.1V 的输出电压范围内稳定运行,最大输出电流为 500mA,受环境温度和电压限制。

PIC18F57Q43 Curiosity Nano double side image

微控制器概述 

MCU卡片 / MCU

default

建筑

PIC

MCU 内存 (KB)

128

硅供应商

Microchip

引脚数

48

RAM (字节)

8196

你完善了我!

配件

Curiosity Nano Base for Click boards 是一款多功能硬件扩展平台,专为简化 Curiosity Nano 套件与扩展板之间的集成而设计,特别针对符合 mikroBUS™ 标准的 Click 板和 Xplained Pro 扩展板。这款创新的基板(屏蔽板)提供了无缝的连接和扩展可能性,简化了实验和开发过程。主要特点包括从 Curiosity Nano 套件提供 USB 电源兼容性,以及为增强灵活性而提供的另一种外部电源输入选项。板载锂离子/锂聚合物充电器和管理电路确保电池供电应用的平稳运行,简化了使用和管理。此外,基板内置了一个固定的 3.3V 电源供应单元,专用于目标和 mikroBUS™ 电源轨,以及一个固定的 5.0V 升压转换器,专供 mikroBUS™ 插座的 5V 电源轨,为各种连接设备提供稳定的电力供应。

Curiosity Nano Base for Click boards accessories 1 image

这些标准小型立体声耳机提供高质量的聆听体验,采用顶级的立体声电缆和连接器设计。它们具有通用兼容性,可以轻松连接到所有MIKROE mikromedia和多媒体板,是您电子项目的理想选择。这些耳机额定功率为100mW,提供从20Hz到20kHz的宽频范围内的清晰音频。其灵敏度为100 ± 5dB,阻抗为32Ω ± 15%,确保最佳音质。Φ15mm的扬声器提供清晰而身临其境的音效。这些耳机不仅具有成本效益且用途广泛,非常适合测试您的原型设备,提供经济可靠的音频解决方案,以补充您的项目。

AM/FM Click accessories image

使用的MCU引脚

mikroBUS™映射器

General-Purpose Output 1
PA0
AN
Reset
PA7
RST
I2C Address Selection
PD4
CS
NC
NC
SCK
NC
NC
MISO
NC
NC
MOSI
Power Supply
3.3V
3.3V
Ground
GND
GND
Shutdown
PB0
PWM
General-Purpose Output 2
PA6
INT
NC
NC
TX
NC
NC
RX
I2C Clock
PB2
SCL
I2C Data
PB1
SDA
NC
NC
5V
Ground
GND
GND
1

“仔细看看!”

Click board™ 原理图

AM/FM Click Schematic schematic

一步一步来

项目组装

Curiosity Nano Base for Click boards front image hardware assembly

从选择您的开发板和Click板™开始。以Curiosity Nano with PIC18F57Q43作为您的开发板开始。

Curiosity Nano Base for Click boards front image hardware assembly
Charger 27 Click front image hardware assembly
PIC18F47Q10 Curiosity Nano front image hardware assembly
Prog-cut hardware assembly
Charger 27 Click complete accessories setup image hardware assembly
Board mapper by product8 hardware assembly
Necto image step 2 hardware assembly
Necto image step 3 hardware assembly
Necto image step 4 hardware assembly
Necto image step 5 hardware assembly
Necto image step 6 hardware assembly
PIC18F57Q43 Curiosity MCU Step hardware assembly
Necto No Display image step 8 hardware assembly
Necto image step 9 hardware assembly
Necto image step 10 hardware assembly
Debug Image Necto Step hardware assembly

软件支持

库描述

此库包含AM/FM Click驱动程序的API。

关键功能:

  • amfm_tune_up - 此功能将当前频率增加10 KHz

  • amfm_set_volume - 此功能设置音量级别,范围为0到63

  • amfm_get_stc - 此功能检查STC位状态

开源

代码示例

完整的应用程序代码和一个现成的项目可以通过NECTO Studio包管理器直接安装到NECTO Studio 应用程序代码也可以在MIKROE的GitHub账户中找到。

/*!
 * \file 
 * \brief AmFm Click example
 * 
 * # Description
 * This app simulate RADIO RECEIVER.
 *
 * The demo application is composed of two sections :
 * 
 * ## Application Init 
 * Initializes device.
 * 
 * ## Application Task  
 * Several additional functions are executed and printed over the terminal.
 * 
 * \author MikroE Team
 *
 */
// ------------------------------------------------------------------- INCLUDES

#include "board.h"
#include "log.h"
#include "amfm.h"

// ------------------------------------------------------------------ VARIABLES

static amfm_t amfm;
static log_t logger;

float aux;
uint8_t volume = 0x3F;
uint8_t mute_flag = 0;
uint8_t status;
uint16_t station_1 = 0;
uint16_t station_2 = 0;
uint16_t station_3 = 0;
uint16_t station_4 = 0;
uint16_t station_5 = 0;
uint16_t station_frequency = 0;
uint8_t memory = 0;

// ------------------------------------------------------- ADDITIONAL FUNCTIONS

void amfm_case_memorize ( )
{
    switch ( memory )
    {
        case 0 :
        {
            station_1 = station_frequency;
            memory += 1;
            log_printf( &logger, "> > > station 1 memorized\r\n" );
            break;
        }
        case 1 :
        {
            station_2 = station_frequency;
            memory += 1;
            log_printf( &logger, "> > > station 2 memorized\r\n" );
            break;
        }
        case 2 :
        {
            station_3 = station_frequency;
            memory += 1;
            log_printf( &logger, "> > > station 3 memorized\r\n" );
            break;
        }
        case 3 :
        {
            station_4 = station_frequency;
            memory += 1;
            log_printf( &logger, "> > > station 4 memorized\r\n" );
            break;
        }
        case 4 :
        {
            station_5 = station_frequency;
            memory = 0;
            log_printf( &logger, "> > > station 5 memorized\r\n" );
            break;
        }
        default :
        {
            break;
        }
    }
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_station_1 ( amfm_t *ctx )
{
    log_printf( &logger, "> > > tune station 1 \r\n" );
    amfm_tune_frequency( ctx, station_1 );
    log_printf( &logger, "> > > tune done \r\n" );
    aux = station_1 / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_station_2 ( amfm_t *ctx )
{
    log_printf( &logger, "> > > tune station 2 \r\n" );
    amfm_tune_frequency( ctx, station_2 );
    log_printf( &logger, "> > > tune done \r\n" );
    aux = station_2 / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_station_3 ( amfm_t *ctx )
{
    log_printf( &logger, "> > > tune station 3 \r\n" );
    amfm_tune_frequency( ctx, station_3 );
    log_printf( &logger, "> > > tune done \r\n" );
    aux = station_3 / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_station_4 ( amfm_t *ctx )
{
    log_printf( &logger, "> > > tune station 4 \r\n" );
    amfm_tune_frequency( ctx, station_4 );
    log_printf( &logger, "> > > tune done \r\n" );
    aux = station_4 / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_station_5 ( amfm_t *ctx )
{
    log_printf( &logger, "> > > tune station 5 \r\n" );
    amfm_tune_frequency( ctx, station_5 );
    log_printf( &logger, "> > > tune done \r\n" );
    aux = station_5 / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_seek ( amfm_t *ctx )
{
    log_printf( &logger, "> > > seek \r\n" );
    amfm_seek( ctx );
    log_printf( &logger, "> > > seek done \r\n" );
    station_frequency =  amfm_get_channel( ctx );
    aux = station_frequency / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_plus ( amfm_t *ctx )
{
    if ( volume < 63 )
    {
        volume += 1;
        amfm_set_volume( ctx, volume );
        log_printf( &logger, "> > > volume: %u \r\n", volume );
    }
    else
    {
        log_printf( &logger, "> > > volume: MAX \r\n" );
    }
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_minus ( amfm_t *ctx )
{
    if ( volume > 0 )
    {
        volume -= 1;
        amfm_set_volume( ctx, volume );
        log_printf( &logger, "> > > volume: %u \r\n", volume );
    }
    else
    {
        log_printf( &logger, "> > > volume: MIN \r\n" );
    }
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_mute ( amfm_t *ctx )
{
    if ( 0 == mute_flag )
    {
        amfm_mute( ctx );
        log_printf( &logger, "> > > mute ON \r\n" );
        mute_flag = 1;
    }
    else
    {
        amfm_unmute( ctx );
        log_printf( &logger, "> > > mute OFF \r\n" );
        mute_flag = 0;
    }
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_tune_up ( amfm_t *ctx )
{
    amfm_tune_up( ctx );
    station_frequency = amfm_get_channel( ctx );
    aux = station_frequency / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

void amfm_case_tune_down ( amfm_t *ctx )
{
    amfm_tune_down( ctx );
    station_frequency = amfm_get_channel( ctx );
    aux = station_frequency / 100.0;
    log_printf( &logger, "> > > frequency: %f MHz \r\n", aux );
    log_printf( &logger, "-----------------------------------------\r\n" );
}

// ------------------------------------------------------ APPLICATION FUNCTIONS

void application_init ( void )
{
    log_cfg_t log_cfg;
    amfm_cfg_t cfg;

    /** 
     * 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.

    amfm_cfg_setup( &cfg );
    AMFM_MAP_MIKROBUS( cfg, MIKROBUS_1 );
    amfm_init( &amfm, &cfg );

    Delay_ms ( 100 );
    status = amfm_init_device( &amfm );
    if ( 0 == status )
    {
        log_printf( &logger, "> > > app init done < < <\r\n" );
    }
    else if ( 1 == status )
    {
        log_printf( &logger, "> > >    timeout    < < <\r\n" );
    }
    Delay_ms ( 1000 );
    
    amfm_case_seek( &amfm );
    amfm_case_memorize( );
    Delay_ms ( 1000 );
    
    amfm_case_seek( &amfm );
    amfm_case_memorize( );
    Delay_ms ( 1000 );
    
    amfm_case_seek( &amfm );
    amfm_case_memorize( );
    Delay_ms ( 1000 );
    
    amfm_case_seek( &amfm );
    amfm_case_memorize( );
    Delay_ms ( 1000 );
    
    amfm_case_seek( &amfm );
    amfm_case_memorize( );
    Delay_ms ( 1000 );
    
    amfm_case_plus( &amfm );
    Delay_ms ( 1000 );
}

void application_task ( void )
{
    amfm_case_station_1( &amfm );
    // 10 seconds delay
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
       
    amfm_case_station_2( &amfm );
    // 10 seconds delay
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    
    amfm_case_station_3( &amfm );
    // 10 seconds delay
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    
    amfm_case_station_4( &amfm );
    // 10 seconds delay
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    
    amfm_case_station_5( &amfm );
    // 10 seconds delay
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
    Delay_ms ( 1000 );
}

int main ( void ) 
{
    /* Do not remove this line or clock might not be set correctly. */
    #ifdef PREINIT_SUPPORTED
    preinit();
    #endif
    
    application_init( );
    
    for ( ; ; ) 
    {
        application_task( );
    }

    return 0;
}

// ------------------------------------------------------------------------ END

额外支持

资源

喜欢这个项目吗?

'购买此套件' 按钮会直接带您进入购物车,您可以在购物车中轻松添加或移除产品。