1、捣鼓TEA5767收音机捣鼓TEA5767可能好多朋友说一个买收音机也就几块钱,何必花这么大精力鼓捣这个烂玩意,如果真有这个想法的朋友请打住,不要在往下面看了。之前也一直认为TEA5767较差,实际中发觉选择大厂的模块出来的音频经放大器推动后还是很有震撼力,大大超出我的预期。不过前提是使用好模块,而不是现在满淘宝卖的那种57块左右的那种简装版咯。TEA5767主要出来的音频没音量控制,也不够推动耳机。我就外加电子音量调节芯片、小功率放大、调节显示等。我电子音量选用M62429 显示选用了一种非常小尺寸的MINI1602 另外使用了手机上那种5向导航键、加了单键开关机电路,小功率放大选用2块TD
2、A2822(3-6V) 就是TDA2822这次把我害惨了,PCB出来后所有正常,就是推动2个2W的小喇叭会有那种噗噗声,晕死。线路输出则很好,在网上一查,发觉很多朋友都有这个问题,现在这个玩意买不到贴片封装的原装进口的,而国产的做BTL方式放大时,由于内部2个放大器的参数国产工艺存在差异较大造成,而做普通双声道放大则不存在这个问题。唉 国货呀,你什么时候才能让人放心!发誓以后再一不会选择使用TDA2822这个垃圾了(需要的朋友 我可以送 现在看着就恼火)1、电路图2、PCB图和尺寸3、PCB实物4、之前调试的电路 还是一贯做法,洞洞板加飞线,不要吓着啦5、焊接后的样子因为彻底对TDA2822失
3、望,所以板子上2个TDA2822放大部分就不考虑安装了,下图中是安了其中一只TDA2822的6、几个主要的元件A、mini1602显示屏,非常小,这个玩意也少B、TEA5767这个玩意版本很多,质量也参差不起,用过3种,这种不错,不是那种简版,当然价格也高了C、M62429 立体声电子音量芯片D、按键电源按键选用443小巧高质量按键功能键使用手机上那种小巧的5向摇杆键E、带通滤波器(BPF)76108MF、钽电容G、mini1602贴片插座7、工作。使用30多厘米的漆包线绕着圈,加长效果更好8、功能设计、思路那个信号强度指示,占用4个字符,其中天线杆符号单独占一个,电平8级指示通过3个字符分割
4、组成,看图应该明白的9、成本做了50块PCB,制版打样费摊到6元左右/块PCB去掉2个TDA2822部分及相关不需要的后实际使用的元件 元件值以下面为准特别注意:组装时 R2电阻0欧姆一定要焊上10、参考程序和烧写文件烧写文件: 该文件只允许会员下载登录 | 注册新用户内部震荡 8M部分参考程序:Tea5767.c#include Tea5767.h#include TwiLib.h/ 初始化TEA5767void TEA5767_Init(ulong Freq,uchar Mono)/ 初始化TWI_Init();TEA5767_Adjust(Freq,Mono,TRUE); / 调整频率、
5、声道void TEA5767_Adjust(ulong Freq,uchar Mono,uchar MuteControl)uchar data5 = 0 ;ulong pll = TEA5767_GetPLLFromFreq(Freq);data0 = (uchar)(pll/256); data1 = (uchar)(pll%256);data2 = (Mono!=0)?0x09:0x01;data3 = 0x92;if( MuteControl )data0 |= 0x80;TWI_MasterSendBytes(TEA5767_TWI_ADDR,5,data);data0 &= 0x7
6、f;DelayMs(500);TWI_MasterSendBytes(TEA5767_TWI_ADDR,5,data); / 信号强度uchar TEA5767_GetLevel()uchar data5 = 0 ;TWI_MasterRecvBytes(TEA5767_TWI_ADDR,5,data);return (data34);/ 由频率计算PLL(频率单位为KHZ)ulong TEA5767_GetPLLFromFreq(ulong Freq)ulong pll = (ulong)(Freq-225)*4000)/32768); return pll;/ 由PLL计算频率(频率单位为
7、KHZ)ulong TEA5767_GetFreqFromPLL(ulong Pll)ulong Freq = (ulong)(float)Pll)*(float)8.192)+225);return Freq;Tea5767.h#ifndef _TEA5767_H_INCLUDED_#define _TEA5767_H_INCLUDED_#include common.h/ TEA5767的TWI地址#define TEA5767_TWI_ADDR 0xC0 / TEA5767基地址/ 初始化TEA5767(频率单位为KHZ)void TEA5767_Init(ulong Freq,ucha
8、r Mono);/ 调整频率、声道void TEA5767_Adjust(ulong Freq,uchar Mono,uchar MuteControl);/ 信号强度uchar TEA5767_GetLevel();/ 由频率计算PLL(频率单位为KHZ)ulong TEA5767_GetPLLFromFreq(ulong Freq);/ 由PLL计算频率(频率单位为KHZ)ulong TEA5767_GetFreqFromPLL(ulong Pll);#endif / _TEA5767_H_INCLUDED_FM62429.c#include FM62429.h/ 初始化函数void FM
9、62429_Init(uchar Volume)FM62429_PORT_INIT();FM62429_AdjustVolume(Volume);/ 调整音量(084)void FM62429_AdjustVolume(uchar Volume)uchar i = 0;ushort VolData = 0;if( Volume 0 )Volume = Volume+3;VolData = (ushort)(Volume&0x7C);VolData |= (ushort)(Volume&0x03)7);/ D9、D10均为VolData |= 0x600;FM62429_SDA_L();FM62
10、429_SCL_L();for( i = 0; i = 1;FM62429_SDA_H();FM62429_SCL_H();NOP();FM62429_SCL_L();FM62429.h#ifndef _FM62429_H_INCLUDED_#define _FM62429_H_INCLUDED_#include Common.h/ 端口定义#define FM62429_SDA_H() SET_BIT(PORTB,PB2)#define FM62429_SDA_L() CLR_BIT(PORTB,PB2)#define FM62429_SCL_H() SET_BIT(PORTB,PB5)#d
11、efine FM62429_SCL_L() CLR_BIT(PORTB,PB5)#define FM62429_PORT_INIT() SET_BIT(DDRB,DDB2);SET_BIT(DDRB,DDB5)/ 初始化函数void FM62429_Init(uchar Volume);/ 调整音量(-83)void FM62429_AdjustVolume(uchar Volume);#endif /_FM62429_H_INCLUDED_main.c#include #include common.h#include LCD1602.h#include TWILib.h#include T
12、ea5767.h#include FM62429.h#define OPER_MODE_RADIO 0 / 正常收音机模式#define OPER_MODE_SET 1 / 设置模式/ 正确保存标志#define SAVE_MASK 0x4B / K/ 设置模式#define SET_MODE_SEARCH 1 / 搜索#define SET_MODE_SOUNDMODE 2 / 立体声、单声道模式选中#define SET_MODE_MIN 1#define SET_MODE_MAX 2/ 声音模式#define SOUND_MODE_STEREO 1#define SOUND_MODE_M
13、ONO 2#define SOUND_MODE_MIN 1#define SOUND_MODE_MAX 2/ 音量#define VOLUME_MAX 84#define VOLUME_MIN 0#define CHANNEL_NUM 10#define CHANNEL_MIN 1#define CHANNEL_MAX CHANNEL_NUM/ 搜索模式#define STATE_SEARCH 1#define STATE_STORE 2/ 最小频率#define FREQ_MIN (ulong)87500)#define FREQ_MAX (ulong)120000)/ 全局变量uchar
14、OperMode = OPER_MODE_RADIO; / 操作模式uchar SetMode = SET_MODE_MIN; / 搜索频道uchar SoundMode = SOUND_MODE_MIN; / 声音模式BOOL DoingMenu = FALSE; / 是否处于选择菜单方式ushort BlinkCounter = 0; / 控制闪烁uchar Volume = 42; / 音量ulong ChannelFreq = 96600; / 频道频率(单位为KHZ)ulong ChannelSearch = FREQ_MIN; / 搜索起始频率uchar ChannelIndex
15、= 0; / 当前播放的频道编号(1-10)uchar ChannelSaveIndex = CHANNEL_MIN;uchar ChannelState = STATE_SEARCH;/ 开关健(PD7)#define POWER_ON() #define POWER_OFF() SET_BIT(DDRD,DDD7);CLR_BIT(PORTD,PD7);/ 闪烁控制变量的最大值#define BLINK_COUNTER_MAX 10/ 是否闪烁#define IS_BLINK() (BlinkCounter BLINK_COUNTER_MAX/2)/=/ 预先保持的10个频道/=ulong
16、 EEMEM ChannelConfigCHANNEL_NUM+1 = 0 ;ulong ChannelArrayCHANNEL_NUM+1 = 0 ;/ 读取预先保持的频道void ReadChannelConfig()ulong data = 0;uchar mask = 0 , i = 0;/ 等待EEPROM空闲eeprom_busy_wait();/ 写入数据eeprom_read_block( ChannelArray,ChannelConfig, 4*(1+CHANNEL_NUM);/ 解析第一个字节,构造第一个字节,从地位到高位分别是:ChannelIndex,Volume,S
17、oundMode,SAVEMASKdata = ChannelArray0;ChannelIndex = (uchar)(data & 0xFF);data = 8;Volume = (uchar)(data & 0xFF);data = 8;SoundMode = (uchar)(data & 0xFF);data = 8;mask = (uchar)(data & 0xFF);if( ( mask != SAVE_MASK ) |( ChannelIndex CHANNEL_MAX ) |( SoundMode SOUND_MODE_MAX ) |( Volume VOLUME_MAX )
18、 ) ChannelIndex = 0;Volume = 42;SoundMode = SOUND_MODE_STEREO;for(i = 0; i CHANNEL_NUM+1; i+ )ChannelArrayi = 0;else ChannelFreq = ChannelArrayChannelIndex;/ 写设置void WriteChannelConfig()/ 构造第一个字节,构造第一个字节,从低位到高位分别是:ChannelIndex,Volume,SoundMode,SaveMaskulong data = SAVE_MASK;data =8; data |= SoundMod
19、e;data =8;data |= Volume;data =8;data |= ChannelIndex;ChannelArray0 = data;/ 等待EEPROM空闲eeprom_busy_wait();/ 写入数据eeprom_write_block( ChannelArray,ChannelConfig, 4*(1+CHANNEL_NUM) ); / 显示存储频道信息void DisplayFreqSave(uchar Index)uchar i = 0;uchar buffer17 = 0 ;/ 显示音量、声音模式for( i = 0;i 16; i+ )bufferi = ;b
20、uffer0 = S;buffer1 = T;buffer2 = O;buffer3 = R;buffer4 = E;buffer5 = :;buffer6 = C;buffer7 = H;buffer8 = (Index/10)+0;buffer9 = (Index%10)+0;LCD1602_Display_String(1,0,buffer);/ 显示频率信息void DisplayFreqInfo(ulong Freq,uchar Index)uchar i = 0,j = 0;ulong data = 0;uchar buffer17 = 0 ;/ 显示频率data = Freq/1
21、0;for( i = 0;i 16; i+ )bufferi = ;if( Index 9999 )data %= 100000;bufferj+3 = (data/10000)+0;data %= 10000;bufferj+4 = (data/1000)+0; data %= 1000;bufferj+5 = (data/100)+0; data %= 100;bufferj+6 = .;bufferj+7 = (data/10)+0; data %= 10;bufferj+8= (data%10)+0;bufferj+9= M;bufferj+10= H;bufferj+11= Z;el
22、sebufferj+3 = (data/1000)+0;data %= 1000;bufferj+4 = (data/100)+0; data %= 100;bufferj+5 = .;bufferj+6 = (data/10)+0; data %= 10;bufferj+7 = (data%10)+0;bufferj+8= M;bufferj+9= H;bufferj+10= Z;LCD1602_Display_String(2,0,buffer);/=/ 按键处理/=/ 按键S1-S5(PD2-PD7)/ 是否为单个键按下#define IS_KEY_PRESSED(k) (k) 0) &
23、 (k) & (k)-1) = 0 )/#define GET_KEY_CODE() (PIND) & 0x1F)#define KEY_CODE(n) (uchar)1) = 2;keycode = keycode;keycode &= 0x3F; / 6个键return keycode;/ 读取按键uchar GetKey( )uchar key = 0;static uchar lastkey = 0; / 记录上次的按键/ 读取键盘key = GET_KEY_CODE();if( !IS_KEY_PRESSED(key) )lastkey = 0;return 0;/ 确定是否新的键按
24、下if( lastkey = 0 ) lastkey = key; / 保存本次扫描结果DelayMs(10); / 去抖处理key = GET_KEY_CODE();if( key = lastkey )return key;return 0;/=/ 设置函数/=void SetHandler()uchar key = 0;/ 切换闪烁标志BlinkCounter+;if( BlinkCounter BLINK_COUNTER_MAX )BlinkCounter = 0;/ 确定是否为选择菜单if( DoingMenu )key = GetKey();if( key = KEY_S1) / 设置键(确认)DoingMenu = FALSE; / 结束菜单选择if( SetMode = SET_MODE_SOUNDMODE )S
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1