基于STM32单片机的FM调频TEA5767功放收音机方案原理图设计

news/2024/11/15 1:59:21/

硬件电路的设计

(末尾附文件)
系统的功能分析及体系结构设计
3.1.1系统功能分析
本设计由STM32F103C8T6单片机电路+液晶1602显示电路+收音机模块TEA5767电路+按键电路+LM386喇叭功放电路组成。
1、通过LCD1602液晶实时显示收音机的频率。
2、通过按键可以调节频率,当调制解调成功后,喇叭输出广播或者通过耳机进行收听。
4、耳机和喇叭只能进行一个接受,本设计不赠送耳机的,有板载喇叭。
3、频率调节范围:87.5MHZ–108MHZ。
3.1.2系统总体结构
本系统具体框图如下图所示:
在这里插入图片描述
原理图:
在这里插入图片描述
STM32单片机核心电路设计
STM32系列处理器是意法半导体ST公司生产的一种基于ARM 7架构的32位、支持实时仿真和跟踪的微控制器。选择此款控制芯片是因为本系统设计并非追求成本的最低或更小的功耗,而是在实现本设计功能的前提下能够提供更丰富的接口和功能以便于设计实验系统各实验项目所需的外围扩展电路。此款控制芯片在完成单片机课程的学习后上手较为容易,在医疗器械中应用广泛,具有很好的学习、实验研究价值。
一、STM32的主要优点:
(1)使用ARM最新的、先进架构的Cortex-M3内核
(2) 优异的实时性能
(3) 杰出的功耗控制
(4) 出众及创新的外设
(5) 最大程度的集成整合
(6) 易于开发,可使产品快速将进入市场
二、STM32——最佳的平台选项
对于使用同一平台进行多个项目开发而言,STM32是最
佳的选择:
(1) 从仅需少量的存储空间和管脚应用到需要更多的存储空间和管脚的应用
(2) 从苛求性能的应用到电池供电的应用
(3) 从简单而成本敏感的应用到高端应用
(4) 全系列脚对脚、外设及软件的高度兼容性,给您带来全方位的灵活性。您可以在不必修改您原始框架及软件的条件下,将您的应用升级到需要更多存储空间或精简到使用更少存储空间/ 或改用不同的封装的规格。
STM32F103C8T6单片机核心板接口电路图如下图所示。
在这里插入图片描述
在这里插入图片描述
按键电路(含上拉电阻)设计
轻触按键是按键产品下属的一款分类产品,它其实相当于是一种电子开关,只要轻轻的按下按键就可以是开关接通,松开时是开关就断开连接,实现原理主要是通过轻触按键内部的金属弹片受力弹动来实现接通和断开的。
在本系统中,按键作为系统的输入,起到了人机交互的枢纽作用。按键的单片机控制引脚默认为高电平,当按键按下后,单片机的相关引脚则变成低电平。进而实现对系统的手动输入。其电路原理图如下图所示。电路中电阻作用为上拉电阻,保证按键信号的稳定输出。
在这里插入图片描述
LM386功率放大器电路设计
本设计扬声器放大电路选择LM386芯片进行放大,放大声音可调。
LM386是美国国家半导体公司生产的音频功率放大器,是一种音频集成功放,具有自身功耗低、更新内链增益可调整、电源电压范围大、外接元件少和总谐波失真小等优点的功率放大器,广泛应用于录音机和收音机之中。为使外围元件最少,电压增益内置为20。但在1脚和8脚之间增加一只外接电阻和电容,便可将电压增益调为任意值,直至 200。输入端以地位参考,同时输出端被自动偏置到电源电压的一半,在6V电源电压下,它的静态功耗仅为24mW,使得LM386特别适用于电池供电的场合。
二、注意事项
(1)PCB设计时,所有外围元件尽可能靠近LM386;地线尽可能粗一些;输入音频信号通路尽可能平行走线,输出亦如此。
(2)耦合电容。此电容的作用有二:隔直+耦合。隔断直流电压,直流电压过大有可能会损坏喇叭线圈;耦合音频的交流信号。它与扬声器负载构成了一阶高通滤波器。减小该电容值,可使噪声能量冲击的幅度变小、宽度变窄;太低还会使截止频率(fc=1/(2πRLCout))提高。功率放大器的电路原理图如下图所示。电位器可以调节声音大小,电容均为滤波电容。电阻均为限流电阻。
在这里插入图片描述
TEA5767收音机模块电路设计
TEA5767是飞利浦公司生产的一款收音机芯片,FM收音功能,这个功能主要是有FM收音模块来完成。其中FM收音模块的核心就是下面的Philips(飞利浦)TEA5767。这是一块性能比较良好的FM收音芯片,很多的MP3都是用这个型号来实现FM收音功能。高灵敏度,高稳定性,低噪音。
本收音机模块采用飞利蒲公司FM调频专用芯片模组TEA5767,板上采用飞利蒲公司耳机功放芯片TDA1308作为音频放大。板载3.5MM 音频接口 可以直接接耳机、功放等。
和单片机通讯只要接 电源 地 和2根I2C 通讯线就可以。
电路板 背后,标有 I2C接口定义 电源接口定义,音频输出,天线接口。
TEA5767内置了主频高达75MHZ的数字信号处理器,实现384KBPS/48KHZ的MD级高品质MP3音乐文件回放,加上拥有一般MP3播放器难以企及的高保真回放线路(信噪比高达95DB,THD总谐波失真率〈0.05%〉,同时非常省电。
一、TEA5767模块参数
(1)频率范围从76—108MHZ自动数字调谐。
(2)一片低功耗电调谐调频立体声收音机电路,其内部集成了中频选频和解调网络,可以做到完全免调。
(3)高灵敏度(使用低噪声射频输入放大器)。
(4)高放自动增益控制(AGC)电路。
(5)LC调谐振荡用低成本固定芯片。
(6)调频中频选择在内部完成,中频免调。
(7)锁相环调谐系统。
(8)软静音,立体声消噪(SNC),高电平切割 (HCC)能通过总线关断
(9)电源:5V
(10)电路板尺寸:31 X 30 MM
(11)带有电源反向保护二极管
(12)板上带有电源输出滤波电感
(13)多个电容组合滤波
(14)蓝色电源指示灯
(15)可以直接拔插的天线口
(16)I2C总线通讯
TEA5767模块在电路中的原理图如下,电阻均为上拉电阻,保证信号的稳定输出。
在这里插入图片描述

系统软件设计

在这里插入图片描述

#include "fm_TEA5767.h"//*****************参数定义*****************************
unsigned long int  FM_FREQ;  //频率
unsigned short int FM_PLL;   //PLL
//uchar  sbuf[5];   		// 数据发送缓冲区uchar sbuf[5]={0XF0,0X2C,0XD0,0X10,0X40};  //FM模块预设值uchar rbuf[5]={0X00,0X00,0X00,0X00,0X00};uchar ampint[5]={0X27,0X40,0X42,0X46,0XC3};uchar  numbyte;
uchar  numbyte_AMP;
uchar  ADDRESS_AMP;
uchar  ADDRESS_SEND;    //TEA5767发送地址
uchar  ADDRESS_RECEIVE; //TEA5767接收地址
//uchar  rbuf[5];   		 // 数据接收缓冲区
//uchar  ampint[5];
uchar  PLL_HIGH;  
uchar  PLL_LOW;   //设定用于搜索和预设的可编程频率合成器
uchar  I2C_byte1;//发送的五字节TEA5767可位寻址的设置值
uchar  I2C_byte2;
uchar  I2C_byte3;
uchar  I2C_byte4;
uchar  I2C_byte5;#define MUTEI2CB1 0x80
#define SMI2CB1 0x40
#define SUDI2CB3 0x80
//sbit MUTE =I2C_byte1^7;//如果MUTE=1,则左右声道被静音;MUTE=0,左右声道正常工作	 
//sbit SM = I2C_byte1^6; //SM=1,则处于搜索模式;SM=0,不处于搜索模式
//sbit SUD=I2C_byte3^7;  //SUD=1,增加频率搜索;SUD=0,减小频率搜索uchar   byte1;  
uchar   byte2;
uchar   byte3;
uchar   byte4;
uchar   byte5;
uchar num1,num2,num3,num4;
uchar   tab1[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
unsigned char   NACK;    		// 错误标志位
unsigned char foo;#define SDA_RCC			RCC_APB2Periph_GPIOC
#define SDA_GPIO		GPIOC
#define SDA_GPIO_PIN	GPIO_Pin_13#define SCL_RCC			RCC_APB2Periph_GPIOC
#define SCL_GPIO		GPIOC
#define SCL_GPIO_PIN	GPIO_Pin_14#define SCL_OUT() SCL_Set_Output() //置位scl
#define SET_SCL() GPIO_SetBits(SCL_GPIO, SCL_GPIO_PIN) //置位scl
#define CLE_SCL() GPIO_ResetBits(SCL_GPIO, SCL_GPIO_PIN)//清楚scl#define SDA_OUT() SDA_Set_Output()
#define SDA_INT() SDA_Set_Input()
#define SET_SDA() GPIO_SetBits(SDA_GPIO, SDA_GPIO_PIN)//置位sda
#define CLE_SDA() GPIO_ResetBits(SDA_GPIO, SDA_GPIO_PIN)//清楚sda
#define SDA_VAL() GPIO_ReadInputDataBit(SDA_GPIO, SDA_GPIO_PIN)#define SDA_V PCin(13)
#define SDA PCout(13)	
#define SCL PCout(14)	void SCL_Set_Output(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(SDA_RCC,ENABLE);//使能时钟GPIO_InitStructure.GPIO_Pin = SCL_GPIO_PIN;				 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 GPIO_Init(SCL_GPIO, &GPIO_InitStructure);					 					
}	void SDA_Set_Output(void)
{GPIO_InitTypeDef  GPIO_InitStructure;	RCC_APB2PeriphClockCmd(SDA_RCC,ENABLE);//使能时钟GPIO_InitStructure.GPIO_Pin = SDA_GPIO_PIN;				 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; 		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 GPIO_Init(SDA_GPIO, &GPIO_InitStructure);					 					
}	void SDA_Set_Input(void)
{GPIO_InitTypeDef  GPIO_InitStructure;RCC_APB2PeriphClockCmd(SCL_RCC,ENABLE);//使能时钟	GPIO_InitStructure.GPIO_Pin = SDA_GPIO_PIN;				 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; 		 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;		 GPIO_Init(SDA_GPIO, &GPIO_InitStructure);					 
}//void    LCMInit(void);//LCD初始
//void    DelayMs(uint Ms);//1MS基准延时程序
//void    WriteDataLCM		(uchar WDLCM);//LCD模块写数据
//void    WriteCommandLCM	(uchar WCLCM,BuysC); //LCD模块写指令
//uchar   ReadStatusLCM(void);//读LCD模块的忙标
//void    DisplayOneChar(uchar X,uchar Y,uchar ASCII);//在第X+1行的第Y+1位置显示一个字符
//void    LCDshow(void);
//void    DelayMs(uint Ms);
//void    show();     //开机问候语//******************************************
void init(void)
{ 	SCL_OUT();SDA_OUT();numbyte = 5;numbyte_AMP=5;ADDRESS_SEND = 0xC0;// TEA5767写地址 1100 0000ADDRESS_RECEIVE=0XC1;//TEA5767读地址 1100 0001ADDRESS_AMP=0X8E;//		uchar sbuf[5]={0XF0,0X2C,0XD0,0X10,0X40};  //FM模块预设值
//    uchar rbuf[5]={0X00,0X00,0X00,0X00,0X00};
//    uchar ampint[5]={0X27,0X40,0X42,0X46,0XC3};FM_PLL=0X302C;FM_FREQ=97000000; //开机预设频率 PLL_HIGH=0;PLL_LOW=0;delay_ms(100);// delay100ms();delay_ms(100);//delay100ms();//    P1=0XFF;
//    P2=0XFF;I2C_byte1=0XF0;  //FM模块预设值I2C_byte2=0X2C;I2C_byte3=0XD0;I2C_byte4=0X10;I2C_byte5=0X40;byte1=0X27;  byte2=0X40;byte3=0X42;byte4=0X46;byte5=0XC3;sendnbyte(&ADDRESS_SEND,numbyte);delay_ms(100);//delay100ms();AMP_sendnbyte(&ADDRESS_AMP,numbyte_AMP);
}//************************************************
//送n字节数据子程序 
void sendnbyte(uchar *sla, uchar n)
{          uchar *p;sbuf[0]=I2C_byte1;sbuf[1]=I2C_byte2;sbuf[2]=I2C_byte3;sbuf[3]=I2C_byte4;I2C_start();			// 发送启动信号sendbyte(sla);    		// 发送从器件地址字节checkack();    			// 检查应答位if(foo == 1){ NACK = 1;return;    		// 若非应答表明器件错误置错误标志位NACK}delay_us(5);p = &sbuf[0];while(n--){ sendbyte(p);checkack();    	// 检查应答位delay_us(5);if (foo == 1){NACK=1;return;    	// 若非应答表明器件错误置错误标志位NACK}p++;}stop();    			// 全部发完则停止
}//*************************************************
//在SCL为高时,SDA由高变低即为I2C传输开始
void I2C_start(void)   
{SCL_OUT();SDA_OUT();SDA=1;SCL=1;delay_us(5);//DELAY5US;SDA=0;delay_us(5);//DELAY5US;SCL=0;
}void stop(void)	 //在SCL为高时,SDA由低变高即为I2C传输结束
{SCL_OUT();SDA_OUT();SDA=0;SCL=1;delay_us(5);//DELAY5US;SDA=1;delay_us(5);//DELAY5US;SCL=0;
}
//****************************************************
//发送一个字节数据子函数
void sendbyte(uchar *ch)
{ uchar  n00 = 8;  uchar  temp00;temp00 = *ch;SCL_OUT();SDA_OUT();	while(n00--){ if((temp00&0x80) == 0x80)    // 若要发送的数据最高位为1则发送位1{SDA = 1;    // 传送位1SCL = 1;delay_us(15);//DELAY5US;SCL = 0; SDA = 0;}else{  SDA = 0;    // 否则传送位0SCL = 1;delay_us(15);//DELAY5US;SCL = 0;  }temp00 = temp00<<1;    // 数据左移一位}
}
//发送n字节数据子程序
void AMP_sendnbyte(uchar  *sla, uchar n)
{          uchar  *p;ampint[0]=byte1;ampint[1]=byte2;ampint[2]=byte3;ampint[3]=byte4;ampint[4]=byte5;	I2C_start();			// 发送启动信号sendbyte(sla);    		// 发送从器件地址字节checkack();    			// 检查应答位delay_us(5);if(foo == 1){ NACK = 1;return;    		// 若非应答表明器件错误置错误标志位NACK}p=&ampint[0];while(n--){ sendbyte(p);checkack();    	// 检查应答位
delay_us(5);		if (foo == 1){NACK=1;return;    	// 若非应答表明器件错误置错误标志位NACK}p++;																		  }stop();    			// 全部发完则停止
}
//****************************************
//向上搜索	
void search_up(void)
{ I2C_byte1 |= MUTEI2CB1;//MUTE=1;			//静音I2C_byte3 |= SUDI2CB3;//SUD=1;	        //搜索标志位设为向上if(FM_FREQ>108000000){FM_FREQ=87500000;} //	判断频率是否到顶FM_FREQ=FM_FREQ+100000;			//频率加100KFM_PLL=(unsigned short)((4000*(FM_FREQ/1000+225))/32768);//计算PLL值setByte1Byte2();	//设置I2C第一第二字节PLL	值
}
//*******************************
// 向下搜索
void search_down(void)
{    I2C_byte1 |= MUTEI2CB1;//MUTE=1;	//静音I2C_byte3 &= ~SUDI2CB3;// SUD=0;//搜索标志位设为向下if(FM_FREQ<87500000){FM_FREQ=108000000;}  //	判断频率是否到底FM_FREQ=FM_FREQ-100000;				 //频率减100KFM_PLL=(unsigned short)((4000*(FM_FREQ/1000+225))/32768); 	//计算PLL值setByte1Byte2();		//设置I2C第一第二字节PLL	值}
//应答位检查子函数
void checkack(void)
{ SCL_OUT();SDA_OUT();SDA_INT();	SDA = 1;    		// 应答位检查(将p1.0设置成输入,必须先向端口写1)	SCL = 1;foo = 0;delay_us(20);//DELAY5US;if(SDA_V == 1)    	// 若SDA=1表明非应答,置位非应答标志F0foo = 1;SCL = 0;SDA_OUT();
}
//第一第二字节PLL值设定
void setByte1Byte2(void)
{PLL_HIGH=(uchar)((FM_PLL >> 8)&0X3f);	 //PLL高字节值I2C_byte1=(I2C_byte1&0XC0)|PLL_HIGH;		 //I2C第一字节值PLL_LOW=(uchar)FM_PLL;					 //PLL低字节值I2C_byte2= PLL_LOW;						 //I2C第二字节值sendnbyte(&ADDRESS_SEND,numbyte);	     //I2C数据发送I2C_byte1 &= ~MUTEI2CB1;//MUTE=0;delay_ms(100);//delay100ms();						  //延时100mssendnbyte(&ADDRESS_SEND,numbyte);	  //I2C	数据发送delay_us(5);//DELAY5US;
}

.

链接:https://pan.baidu.com/s/1OEtvg-TRUTeeCCMg3WZsiQ
提取码:iq3o

.


http://www.ppmy.cn/news/452993.html

相关文章

STC学习:“FM收音机”原理与测试说明

程序设计目标及程序运行效果说明 程序设计目标&#xff1a;通过本案例理解简单收音机的原理&#xff0c;尤其是理解收音机芯片RDA5807P的相关功能与工作原理&#xff0c;通过与RDA5807P芯片通信里然后设置相关寄存器的值可以收听一定频率的广播电台并且能够调节音量。 程序运行…

天线基本参数

天线的基本参数 天线功能天线基本参数输入阻抗辐射场型波束立体角辐射强度方向性增益天线孔径天线极化 天线功能 无线通信载体为电磁波&#xff0c;而天线的作用就是把传输线上传播的导行波&#xff0c;变换成无界媒介中传播的电磁波。它的功能有以下两个方面&#xff1a; 1. …

drtek收音机使用说明_车载收音机按键图解说明,老式车载收音机说明书

车载收音机按键图解说明(参考19款卡罗拉 1.2T 先锋版) 控制面板 ① SEEK/TRACK按键&#xff0c;搜索频率。 ②“POWER VOLUME” 旋钮 &#xff0c;按下就是打开或关闭音响系统&#xff0c;而转动则是调节音量。 ③ MODE按键&#xff0c;切换音源。 ④ (显示屏下方)6个按键&…

Java参数传值(模拟收音机)

引用类型参数的传值 Java的引用类型&#xff1a; 当参数是引用类型时&#xff0c;“传值”的是变量中存放的“引用”&#xff0c; 而不是变量所引用的实体。 需要注意的是&#xff1a;对于两个相同类型的引用类型变量&#xff0c;如果具有相同的引用&#xff0c;就会用同样的…

OpenGL之鼠标拾取和模型控制

文章目录 鼠标拾取转化步骤步骤 0&#xff1a;2D 视口坐标步骤 1&#xff1a;3D 规范化设备坐标步骤2&#xff1a;4d 均匀剪辑坐标步骤3&#xff1a;4D 眼&#xff08;相机&#xff09;坐标步骤4&#xff1a;4d 世界坐标 源码 模型控制源码 鼠标拾取 转化步骤 使用鼠标单击或“…

痞子衡嵌入式:主流QuadSPI NOR Flash厂商关于QE位与IO功能复用关联设计

大家好&#xff0c;我是痞子衡&#xff0c;是正经搞技术的痞子。今天痞子衡给大家讲的是几家主流QuadSPI NOR Flash厂商关于QE位与IO功能复用关联设计。 痞子衡之前写过一篇文章 《串行NOR Flash下载/启动常见影响因素之QE bit》&#xff0c;这篇文章介绍了几家主流厂商关于 QE…

给初级测试工程师的一些避坑建议

我遇到的大多数开发人员都不怎么热衷于测试。有些会去做测试&#xff0c;但大多数都不测试&#xff0c;不愿意测试&#xff0c;或者勉而为之。我喜欢测试&#xff0c;并且比起编写新的代码&#xff0c;愉快地花更多的时间在测试中。我认为&#xff0c;正是因为专注于测试&#…

苹果x要不要升ios14.4系统?

iphone X真的不要试图升级到最新版本&#xff01; 我现在和大家分享了我这款手机它使用的是IOS14.4.2系统&#xff0c;我能够感觉到这款系统它确实可能会解决一定的安全bug的问题&#xff0c;不过在我实际体验过程中&#xff0c;这款手机所能够给我带来的体验值并不高。 手机在…