我们燕山大学“燕之波”无线电测向协会基于哈工大制作信号源的方法,改用STM32单片机制作信号源
参考链接:
哈工大 0.8W 80m信号源制作方法
微信 蓝蓝的生活 设计篇 、 硬件篇、 软件篇 、跳坑篇
元器件列表
单片机:STM32
频率发生芯片:CDCE913
线性稳压器:①降压芯片:AMS1117-3.3 (-xx 是电压转换后的电压值,-3.3就是输出3.3V,-5就是输出5V。注:这里的选择请看后面的详细介绍) ②升压芯片:MT3608L
充电管理:TP4056
功放中的三极管/功率管:9013、2SD882
方案介绍
数字电路部分
频率发生器
CDCE913可通过单个输入频率生成多达 3 个输出时钟,即 图1 中的Y1 Y2 Y3引脚,不过我们只使用Y1一个输出引脚作为信号输出就行。
CDCE913的输入晶振可以选择在9MHz~32MHz之间即可,但需要注意,选择不同频率的晶振和输出不同频率的信号,在后续我们使用单片机写入CDCE913的寄存器中的值是不一样的,需要使用官方提供的ClockPro软件进行查询。怎样使用这个软件我放到后面 代码? -> 怎么"写"?讲。
LAMP和CTRL分别与STM32相连,这两个引脚在STM32中的设置是完全相同的。在使用I2C对CDCE913中的寄存器进行修改后,CDCE913的Y1引脚会持续输出对应频率的信号,但是我们希望他间断的发送信号,因为我们要发送摩斯码,这个CTRL可以通过高低电平控制信号是否输出。LAMP是使用发光二极管显式的观察间断情况。将STM32与LAMP和CTRL连接的引脚设置成推挽输出,置1时发送信号,置0时不发送信号。
CDCE913_SDA和CDCE913_SCL是CDCE913和STM32使用I2C进行通信的通信线,我们在STM32单片机设置引脚时使用开漏输出,因此R22和R23电阻是通信线的上拉电阻。
升压/降压芯片
在电路中,我们使用3.3V电压为STM32单片机和CDCE913频率发生器供电,使用9V电压用作功放电路。我们选择的电池是3.7V的,因此需要升压和降压。
降压芯片我们选择的AMS1117-3.3,这个芯片与哈工大使用的TPS79333不同,TPS79333在输入电压为3.7V时可以降压到3.3V,但AMS1117-3.3包括AMS1117-5都不能在输入电压为3.7V时输出对应电压,都只能输出3V,我们搜集资料发现,输入电压要至少比输出电压大1.4V才可以,因此我们使用升压后的9V作为了AMS1117-3.3的输入。
( >我们用AMS1117-3.3主要是因为实验室有现成的不用额外买 )
升压芯片我们选择的MT3608L,我们没选择哈工大的HX3033是因为它不好买(还贵)。输出电压的值可以通过电阻(图中R28和R31)之间的比值进行调整。 V o u t = V r e f × ( 1 + R 28 R 31 ) V_{out} = V_{ref} \times (1 + \frac{R_{28}}{R_{31}}) Vout=Vref×(1+R31R28),其中 V r e f = 0.6 V ( T y p i c a l ) V_{ref} = 0.6V(Typical) Vref=0.6V(Typical),这样算出来 V o u t = 9 V V_{out} = 9V Vout=9V。R29也就是连接引脚OC的电阻,位于19kΩ到96kΩ就行。
充电管理
LED4用红灯表示还未充满,LED5用绿灯表示充满。VCC引脚连充电口,BAT引脚连电池。
在充电过程中TP4056会发热,是正常现象。芯片底部有一大块接地的焊盘,是散热用的,要焊在板子上,用板子上的铜板进行散热。
滤波
拨码开关
目前选择信号源台号使用的是和哈工大一样的策略,即二进制选台,
0
−
9
0-9
0−9台对应
0000
−
1001
0000-1001
0000−1001,MO对应
1010
1010
1010,剩余二进制也全部对应MO台。
后续想用旋钮开关,不过占用STM32引脚较多,还在考虑改进。
下载调试端口+充电口+开关
下载端口我们留出了5脚排针,使用STLINK(简单的U盘样子的)进行烧写和调试,STLINK中电源线如果连接VIN,不打开K1开关即可烧写;如果连接5V需要打开K1开关才能烧写,但同时也可以给电池充电了。
K1是自锁按键开关,按下会锁住,保持2 3脚连通给板子供电,再按下会弹起,1 2脚连通即断路。
主控芯片STM32
制板时,晶振下面需要接地的铜最好屏蔽一下
模拟电路部分
这部分主要就是功放电路
图9是需要画在板子上的部分,还有两个线圈及天线在壳子上。
地:功放电路的地要与数字电路区分开,防止相互干扰。三角形代表模拟地,4条线代表数字地。模拟地在制板的时候需要考虑连接金属壳贴着大地或者引出一根地线插地里。
滤波电容:图9中的电容C46 C47 C18 C20 C21都是滤波电容。
三极管:三极管Q1是共射放大器,放大电压和电流;三极管Q2是缓冲级;T1线圈将电压放大2倍;VT3功率管和T2共同组成功率放大器。功率管工作时会发热,所以需要连散热片,不然很容易击穿。
磁环:磁环T1 T2 L4都是绿色磁环,外径22,内径13.5,高9.3。L3使用NXO-100黑色磁环。
制作过程
PCB制板
图11是打板的原理图,因此没有图10的两个线圈。
预览图12上方黄色部分是裸露铜板用来放置散热片。建议在CDCE913 Y1输出同时也是功放电路信号输入部分预留一个焊盘用来使用示波器测试是否数字电路是否正常输出信号。
线圈的缠绕
漆包线的组成是中间为导电的铜线,外面有一层漆覆盖。如果要焊接在板子上,需要将焊接部分的漆处理掉。先用打火机将漆烧掉,然后用砂纸刮。着重处理焊接部分的漆即可。非焊接部分的漆包线,尤其是贴近磁环的部分,尽量不要使漆包线裸露铜线,可能会导致断路。
焊接的时候,尽量不要让线圈与板子之间的漆包线太长,这样会使得线圈自由度比较高,后续使用信号源的时候线圈会活动,可能会使焊接点的漆包线断掉。
T1线圈
把0.4mm漆包线的3股线拧在一起,然后绕在绿色磁环上,线圈绕制的方向见图13右图,绕13圈,这样在其中两根首尾相连之后就成为了26圈。在拧在一起之前,标记好哪个头和哪个尾是同一根线的(如果有万用表,可以用万用表测通断,来判断哪一个头对应哪一个尾)。在绕在线圈上之后,按照图13左图方式将其中一个头和另一条线的尾连接在一起。图13引脚标号与图9原理图中对应。右图中电流起点对应1 3侧,电流终点对应2 4侧。
实图见下图:
T2线圈
使用0.4mm漆包线缠绕在绿色磁环上,线圈各个部分的线的方向如图14所示。图14引脚标号与图9原理图中对应。
实图见下:
L3线圈
0.4mm漆包线缠绕NXO-100磁环,算上头尾共从磁环绕出 1+12=13 个抽头, 1 1 1连接T2中的4端, 12 12 12连接13脚旋钮开关外圈12个脚。绕制方向没有要求,不一定按照图中方向。
一共13个抽头,11个麻花和(1+1)个单线,11个麻花和一个单线焊接在13脚旋钮开关外圈12个脚,另一个单线预留连接T2中的4端
13脚旋钮开关(外圈12个脚+1个公共端)靠近中间位置有一个引脚,这个引脚叫公共端,焊在这个引脚上一根导线(额外的导线,不是刚刚从磁环中抽出的抽头),用来穿过图10中L4线圈并最终焊接在天线上。
这个旋钮型号是 1刀12档 直插脚 20mm花柄
实图如下:
最终这个整体会有两个导线引出,一个是缠绕线圈时预留的,一个是旋钮公共端引出的。
L4线圈
使用0.4mm漆包线缠绕17圈在绿色小磁环上,没有方向要求。漆包线首尾分别连接发光二极管两端。实图如下:
最终L3的公共端引出的线要穿过L4,如下如:
调试
电源部分
将充电口+开关、降压、升压、充电管理和滤波部分焊接在电路板上
1、插上电池,测量电池插口母座正负极之间电压是否是电池电压。我们使用的是3.7V电池,电池电压范围在3.7~4.3V左右。
2、拔下电池,插上充电线,TP4056的BAT引脚能否正常输出电压。
3、按下总开关,测量升压模块能够正确输出9V电压;降压模块能否正确输出3.3V电压。
单片机STM32部分
STM32、单片机晶振、CDCE913中的LED6和程序下载/调试接口的5排针焊在电路板上,用STLINK连接5排针(程序下载/调试接口),在Keil5中编写以下代码并烧写:
#include "stm32f10x.h" // Device header
void Delay_us(uint32_t xus){
SysTick->LOAD = 72 * xus; //设置定时器重装值
SysTick->VAL = 0x00; //清空当前计数值
SysTick->CTRL = 0x00000005; //设置时钟源为HCLK,启动定时器
while(!(SysTick->CTRL & 0x00010000)); //等待计数到0
SysTick->CTRL = 0x00000004; //关闭定时器
}
void Delay_ms(uint32_t xms){
while(xms--){
Delay_us(1000);
}
}
int main(){
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
GPIO_SetBits(GPIOB, GPIO_Pin_10);
while(1){
Delay_ms(500);
GPIO_ResetBits(GPIOB, GPIO_Pin_10);
Delay_ms(500);
GPIO_SetBits(GPIOB, GPIO_Pin_10);
}
}
如果能够烧录并且可以观察LED6在闪烁,证明单片机能正常工作;否则,检查单片机的焊接情况,有无连焊或者虚焊。
CDCE913部分
焊接上CDCE913剩余部分、8421拨码开关,我在CDCE913的输出的地方预留了一个焊盘,在这个位置焊接一根导线,连接到示波器上。
再次使用STLINK,烧录完整代码(见最后)
拨码开关拨到
0000
0000
0000,能在示波器上观察到频率为3.50MHz的信号按照摩斯码‘— — — — —’的长短间隔进行发送,将拨码拨为
0011
0011
0011,能在示波器上观察到频率为3.53MHz的信号按照摩斯码‘— — \ — — — \ · · ·’的长短间隔发送。波形如下
功放电路部分
焊接上功放电路部分的元器件、刚刚缠绕的线圈并且拧上散热片,使散热片与裸露铜板紧贴,有导热胶可以涂在中间。
可以一部分一部分焊接功放电路,焊接一点测一点,这部分比较耗时间。
-
先将所有滤波的电容焊接到板子上(所有一端接9V一端接模拟地的电容),然后焊接信号输入端到Q1的相关电阻和电容、Q1以及上下电阻,在Q1的c端能够用示波器测量到峰值大约8.3V电压(哈工大提到约为电源电压),示波器探头一端接Q1的c,一端接地。
-
将缓冲级Q2焊接在板子上,在Q2的e端能测到大约8V左右的电压,比刚刚测的略低些
-
将T1与2端的电阻电容焊在板子上,测量1端相对于地的波形,峰值为8V,如图 示波器图1
测量1端相对于2端的波形,如图 示波器图2,峰值为4V,谷值为-4.2V,电压差为8.2V左右
测量3端相对于4端的波形,如图 示波器图3,峰值为8.6V,谷值为-9.6V,电压差为18.2V左右。变压器T1将电压放大了2倍左右。
-
焊接功率管VT3、线圈T2以及相关电阻电容,使用示波器测量T2的3端相对于模拟地的波形,如图 示波器图4
-
将T2的3端与L3相连,调整L3的档数,发现接入电路的圈数为12圈时能够让L3的输出端相对于地地电压最大,波形如图 示波器图4
-
此时观察连接在L4感应线圈上地LED灯,是最亮的
天线部分
连接天线的射频接头我们使用的是sma接头,分别是“SMA-J-1.5开窗式 内螺内针”和“SMA-KY 接1.13线 外螺内孔”
与天线地线连接的接头
天线选择的是 1平方毫米软导线 3m
地线选择的是 0.3平方毫米软导线 2m
剥离外层胶皮一段距离
将天线地线焊接在SMA-J头上,放上压管,用压线钳压压管,我们使用的是六角压线钳。
最后防止导线与接头焊接部分频繁扭动导致导线断裂,我们在外面套了一层热缩管。
与PCB板连接的接头
过程如下图
最后安装在壳子上的样子如下
大合影
代码?
刨除掉维持整个电路存活的供电部分,以及为了让信号“吼”的更大声的功放电路部分,剩下的就是实现选台和产生信号的部分。这一部分是以STM32为中心,“读”拨码开关是几,然后“说”不同的信号。
怎么“读”?
让初始台号是
0000
0000
0000,我们使用的是8421拨码开关,对应位是几就“或”上几,原理上就是二进制。
比如第4位也就是8421的“8”的这一位是1,那么就是 1xxx,
如果第3位也就是8421的“4”的这一位是0,那么就是 10xx,
如果第2位也就是8421的“2”的这一位是0,那么就是 100x,
如果第1位也就是8421的“1”的这一位是1,那么就是 1001,
最终得到的台号就是
1001
1001
1001换算成十进制就是9号台。
怎么写?()
STM32是使用I2C总线与CDCE913进行通信的,通过向CDCE913中的一些寄存器写入特定的值实现产生特定频率的信号。
本来这些寄存器的值是需要我们查看数据手册然后根据公式去算的,但是实际上官方给了一个方便易使用的ClockPro软件,可以直接获得这些寄存器的值。
实际上我们需要修改的寄存器只是
R
e
g
2
−
6
Reg2-6
Reg2−6以及
R
e
g
16
−
30
Reg16-30
Reg16−30这几个寄存器。
怎么使用I2C对CDCE913中的寄存器进行修改呢?我们在代码中使用的是软件I2C,时序是按照CDCE数据手册设置的,见夏下图:
CDCE913的地址,除了需要注意上面图中提到的需要向左平移一位之外,还要注意,CDCE913很容易出现的一个问题,地址最后两位的问题。后两位是可以编程进行修改的,数据手册中也提到了这个问题:
他是怎么使用SDA/SCL也就是I2C总线进行修改的呢?从数据手册中可以得到答案:
如果我们修改了寄存器1中的后两位,那么你给后两位写了几,CDCE913在I2C总线上的地址的后两位就是几。如果你买了CDCE913在使用I2C通信时发现呼叫不到CDCE913,即应答位没有被CDCE913置为0,那么你就要考虑换一下地址的后两位,反正一共4种情况,不是很费事。
我们的代码
目前我们还没有进行实际的、长时间的信号源测试,上面的内容可能还会做出调整。
附录:
功放电路修改调试记录
1、T2线圈的15圈和4圈要是同方向,即4圈要是15圈的正反馈
2、3.50MHz时,发现L3线圈,磁环为NXO-100,0.3mm漆包线缠绕8圈L3输出峰值最大为80V左右,峰值跳动稍微稳定的值大约是55V左右。
3、发现缓冲三极管发热(不是温热,比较烫手),并且在 2 中L3的缠绕情况下。考虑可能是电流过大,尝试更换T1线圈下方RC谐振的值,从22Ω//1.8pF更换为最初的100Ω//100nF(哈工大),缓冲三极管不再发热
4、在更换了RC的值之后再次调整L3的线圈,NXO-100磁环0.3mm漆包线11圈输出峰值最高90V左右,峰值有跳动,跳动范围为42-90+V,示波器显示峰值跳动问题:
如果增加3-4圈或者减小3-4圈,峰值跳动问题会明显好转,基本稳定在40V左右,如下图。而且发现,峰值跳动不明显的时候功率三极管发热很不明显。T2线圈有点不太能摸出来。
5、发现T2线圈有点温热,这个发现在调整完 3 后依旧存在,微信的解决方法是增加线圈数量。待尝试,不过感觉不是很急,或者待观察,因为不是很热。