免调试模块化的DDS扫频信号发生器-升级版
本帖最后由 palyer 于 2019-4-7 14:49 编辑1、简介
第一个版本基本的想法的是制作简单,有关说明过程参照这个帖子。
第一个版本详细说明
http://www.crystalradio.cn/thread-1744191-1-1.html
本次对扫频信号发生器进行了升级,升级版增加了1602 LCD 和旋转编码器,用于显示当前模式和频率范围,旋转编码器用于调节任意频率工作模式下的频率范围。
在扫描模式时,第一行右边显示刻度中心频率,第二行分别显示扫频起始频率和结束频率。
在单一频率输出是,第二行显示当前频率。
中心频率=(起始频率 + 结束频率)/2。
升级版新增了两个模式:
工作模式8: 自定义扫频范围, 20K-12M (使用AD9833) 20K-70M (使用AD9850),默认100K-500K
工作模式9: 自定义单一频率输出, 范围20K-12M(使用AD9833) 20K-70M (使用AD9850),默认是200K
其实 AD9833 在频率到4M以上就很难看了,AD9850到40M还行,再往上波形也难看。
2、电路图
黑色部分是第一版设计的电路,蓝色部分是升级版新增的。增加了1602 LCD 和旋转编码器,旋转编码器的按钮和按键K1共用中断 INT0,采用二极管隔离,旋转编码器用中断 INT1。
100k电位器用来调节LCD对比度。
3、制作
连线比较多,编写了一个简单的测试程序.
附件 LCD_Encoder_test
这个程序仅仅用来测试LCD显示和旋转编码器,不驱动DDS模块。把旋转编码器和LCD装好之后,可以把测试程序上传到Arduino板,分别顺时针、逆时针旋转编码器,按编码器和按K1键都有不同的显示,会分别显示数字变化,Encoder Pressed,K1 Pressed等。
顺时针旋转,数字会增加,逆时针旋转编码器,数字会减少,如果方向反了,将旋转编码器三个脚的那边,最上面和最下面交换一下位置。
测试LCD图
以上显示正确之后,说明新增元件能正常工作。
旋转编码器5个脚没有编号,采用俯视图,对照电路图连接电路。
升级版完整程序在这里,DDS_SweepV2 。 没有安装1602 LCD和旋转编码器的第一个版本,也可以使用这个程序,只是无法调节频率。
4、测试
采用了增速调节频率的模式,连续快速旋转编码器10次,速度增加到10倍,再快速连续旋转15次,速度增加到100倍,通过增加速度以便快速调节频率范围,等待2秒不旋转旋钮,则速度降为1。
在20K-9999KHz范围调节时,基本步进幅度是1KHz, 100倍则是100KHz,1M以上,基本步进幅度是10KHz。
在扫频模式模式8时,可以分别调节起始和结束频率,把旋转编码器往下按一下,进行两个调节数字之间的切换。
找了一个32.768K的晶振进行测试,晶振的负载为100k电阻,示波器接电路两端,扫频范围为31K-35K。
有关刻度上频率计算方法:
中心频率: (35K+31K)/2 = 33K
示波器每一大格的频率: (35K-31K)/10 = 0.4 K示波器面板有10格
每一小格频率: 0.4K/5 = 0.08K
供各位坛友参考。
补充内容 (2019-4-13 15:13):
V2.2版本最新改动
1、增加一路方波频标输出,可用于无法进行亮度叠加的示波器
2、调整频率下限由20KHz降低到200Hz;
3、增加了频率校准方法;
4、可以将设置参数保存在单片机的EEPROM中,上电自动加载
详细见25楼。
补充内容 (2019-4-21 11:50):
V2.3版本最新改动
1、增加了波形选择,仅仅对AD9833有效
2、增加了扫频速度选择
详细见49楼。
补充内容 (2019-12-29 11:39):
V2.4版本改动:
调整了菜单顺序,修正了不规范
详见68楼。
补充内容 (2023-9-29 21:30):
V2.9版本改动:
将音频扫频的下限下调到20Hz,坛友自己修改源代码可自行调整。
详见491楼。
V2.8的测试版本仅仅用于oled显示屏,用LCD1602的可以不用理会。 见403楼。
补充内容 (2023-9-30 22:13):
V2.10是V2.8的修正版,用于oled显示屏,采用了8x8字体,修正了光标位置。用LCD1602的不用理会。见496楼。 本帖最后由 palyer 于 2023-9-29 21:22 编辑
这个版本是V2.9版,主要是将频率下限进行了调整。
之前有坛友提到现在的版本音频扫频的下限100Hz还是有点高,用于调整功放还是不够宽。最近终于有点时间修改了下程序,硬件部分没有任何改动,将频率下限进行了调整,调整到20Hz,同时也进行了简单处理,大家也可以按照兴趣自己调整范围。
由于音频扫频频率范围的倍率太大,比如从20到20000Hz,倍率是1000倍,不能采用原来的线性方法来调节扫频频率,于是采用了查表法,制作了一张201个频点数据按指数增长(取对数后是线性)的频率变化表,这样也便于坛友自己可以修改表格,按照自己所需的频率范围来调整,注意不能减少频率个数。
其中设置了7个频标,数组下标和频率对应关系是,
开始位置 20Hz
第一频标-80 Hz
第二频标 -160 Hz
第三频标 -320 Hz
第四频标=630 Hz
第五频标 -1300 Hz
第六频标 -2500 Hz
第七频标-5000 Hz
结束位置 20000Hz
如需修改频率,参照下图的位置修改数据。
再谈周期问题,20Hz频率每个周期是50ms,程序每2个频点间隔75ms,完成201个频点整个扫频周期大约是15秒。
数字示波器没有余辉限制,看起来会比较方便。把扫频信号发生器切换成方波频标模式,示波器无需设置为x-y模式,这张图是用数字示波器,在打开方波频标时看到的波形,示波器水平设置时间是2s/div。下图中,1,2,3,4,5,6,7分别是7个频标。
源代码如下:
本帖最后由 palyer 于 2021-3-9 20:57 编辑
dereklxc 发表于 2021-3-9 20:21
老师您好,我是用stm32做的这个,锯齿波台阶做频标,会不会影响测试精度。我测的陶瓷滤波器不知道为啥怪怪 ...
不敢当老师。STM32比MEGA328快数倍,不会影响精度,只是扫频频率会加快,根据其他人的文章,太快了不是好事,所以,您还是需要延时计数,把锯齿波频率降下来。另外,快了之后,频标的亮度会不够,可能需要增加台阶等待时间。
我对滤波器没有太多研究,不过根据我的经验,看你的两张图,形状是一样的,两边高,中间低。NWT是对数检波,所以,在幅值高的地方,高低差异没有那么大。扫频电压的大小会影响扫频的频幅图,会左右移动;阻抗原因,负载的大小,也有影响,你可以在滤波器之后,对地接一个20K左右的可变电阻试试。 sjp 发表于 2019-4-23 14:28
有警告编译通过。
能用吗?我在1.6.7下编译没有警告,难道是arduino自带的库不一样?
我的库版本如下图
sjp 发表于 2019-4-23 13:16
2.4编译不通过,你看看是不是我缺少库文件。
试了一下,写法不规范。在1.8.9下编译没有问题,在1.6.7下编译有问题。稍微改了一下,这个文件可以了。
radio988931 发表于 2023-7-6 23:11
感谢楼主分享制作资料!
一直想拥有一台扫频仪调整收音机中频,无奈成品仪器太贵。看了好多关于制作扫频仪 ...
文件已发送你邮箱。 本帖最后由 palyer 于 2023-9-30 22:29 编辑
radio988931 发表于 2023-9-29 23:46
大神palyer好!您之前发布的V2.8版本,oled 字体小我做了细调,现在还有一点问题请教老师
...
您不用客气!经过测试和查询,位置不正确的原因主要是 lcd1602模块驱动软件库中的设定光标函数setCursor列和行都是字符位置,而在SSD1306ascii模块驱动软件库中,setCursor函数的列是像素,行是字符,所以,如果位置要正确需要用固定宽度的字体,列的位置要乘上字符宽度。
修改了V2.8 为 V2.10,采用了font8x8,像素为 8x8的固定宽度的字符,以上供参考。
现在显示如图,
源代码:
注:V 2.10 和 V 2.9功能一样,V2.10驱动的是oled显示屏,V2.9是驱动 LCD1602。
AX100 发表于 2023-8-29 22:06
楼主如果能修改程序,让自定义频率也能选择输出方波就完美了!那样就可以调整胆机了
AD9833就可以支持方波。 hhyf 发表于 2022-5-26 22:53
请教一下palyer老师,我的编码电位器逆时针旋转没有反应是何原因;换了好几个编码电位器试过了,谢谢您。
我觉得是arduino板有点问题,能不能换一个试试。
旋转编码器判断的逻辑是这样的,如果D3脚(接编码器的其中一个脚)上的电平发生变化,单片机产生一个中断调用,再去检测D3和D9脚电平,判断旋转方向。
可以用示波器看看D3和D9脚的电平,在旋转的时候是不是会发生变化。 卡卡FM 发表于 2022-4-20 10:13
保存问题,在手动在菜单中保存了显示OK..........关机后重启设置参数还是不能保存。
关于保存,要修改一下程序,原来的程序好像装入了设置参数后,把扫频速率复位了,该起来非常简单,见下图,找到这一行,前面加两个英文的//,再上传一次。
关于扫频速率,在40Hz这挡已经是最高了,受限于SPI总线的速率。估计是您用的arduino模块有点问题,单片机工作主频设置有点低。
卡卡FM 发表于 2022-4-19 21:39
请教palyer老师一个小问题:
现在机子装配完成,试机扫频信号各项频率指标均达到你的设计要求。
就是 ...
同步锯齿波的频率是由arduino中的延时函数 DelayMicroseconds 实现的,出现频率低的问题可能是单片机运行速度慢了,arduiono 中有一个例子程序-Blink,就是让板载led亮一秒、熄一秒,可以试试这个例子的运行状态,看时间是否准确。
关于设置的保存问题,需要手动在菜单中去保存一下,程序对扫频频率有保存到EEPROM中的功能。保存的有关参数如下:
struct settingData {
char setName;
char setVersion;
char setSubVersion;
uint16_t setLength;// size include header
char markMethod;// 0 or 1
float AD9833Factor; // default is 1.0, for calibrate frequency
float AD9850Factor;
char waveForm;// 0,1,2 0-sin 1-Triangle 2-square
char sweepSpeed; // 0-4, 0-40Hz 1-20Hz 2-10Hz 3-5Hz 4-1Hz
} settingData;
本帖最后由 sjp 于 2019-4-7 15:25 编辑
液晶屏四线接法,编码器都上去了而且是速度调谐,功能全你太牛了! 太牛了,楼主厉害,简洁而功能全,一定要做一个试试,虽然已经有五个扫频仪了 谢谢!这个好,仿一个!!! 哈哈,全模块制作的工具,佩服了! 能扩展到音频范围就更牛逼了! jiangjieke 发表于 2019-4-7 18:08
能扩展到音频范围就更牛逼了!
有音频的,模式6:扫频频率: 100-20000Hz。升级版有9个项目供选择使用。 第一版还没成功,笫二版就来了,跟不上老师的节凑。第一版做完了,但没有锯齿波,几个模式的信号都成功了,正在研究中,谢老师的公开成果,争取早日仿成功。 能否考虑通过方波信号在第二通道形成频标?
示波器一般都有两个通道,并且有外触发机制。
能否第一个通过送出465KHZ中频信息;第二个通道送出10%占空比的方波(还可以有幅度变化)形成频标,然后第三个通道在每个扫描周期送出一个触发信号让示波器进行触发。
这样对于很多不支持亮度迭加的数字示波器的用户,就能看清楚频标了 老师或者哪位大神能根据老师的电路图做块印刷板就好了,仿制的成功率会更高 onesword 发表于 2019-4-8 08:18
能否考虑通过方波信号在第二通道形成频标?
示波器一般都有两个通道,并且有外触发机制。
能否第一个通过 ...
锯齿波的下降沿能作为外触发吗?如果能的话,改动就很简单,加一路方波频标输出就可以。 onesword 发表于 2019-4-8 08:18
能否考虑通过方波信号在第二通道形成频标?
示波器一般都有两个通道,并且有外触发机制。
能否第一个通过 ...
刚刚试了一下,你这个办法果然可行。
电路都不用改,用了Arduino的一个引脚做方波输出,由于是复用的,平常是高电平,在到达频标时,变为低电平,持续很短时间,形成一个很窄的低电平,在下降沿到达频标的频点。示波器上形成的几个亮点对应的是频标。
示波器放在双通道上,方波用CH1,扫频输出用CH2,示波器采用外部下降沿触发。
我没有你讲的这种数字示波器,用模拟示波器试了,可行。
我再想想怎么设置比较好。
palyer 发表于 2019-4-8 22:05
刚刚试了一下,你这个办法果然可行。
电路都不用改,用了Arduino的一个引脚做方波输出,由于是复用的, ...
大师有空看看把第9项改成超级VFO可变频率振荡器(中频任意设置) 做为电台第一级变频级本地振荡器的可变频率振荡器。这样的话这个机器就可以天天用了。不像扫频仪和信号发生器用完一放就是几个月,机器的利用率将极大地提高。 sjp 发表于 2019-4-9 09:49
大师有空看看把第9项改成超级VFO可变频率振荡器(中频任意设置) 做为电台第一级变频级本地振荡器的可变 ...
谢谢!不是大师,客气了,我也玩这个不久。你的意思是,用来做电台的调谐?这里面有单片机,可能会带来干扰,可以试试。 palyer 发表于 2019-4-9 12:21
谢谢!不是大师,客气了,我也玩这个不久。你的意思是,用来做电台的调谐?这里面有单片机,可能会带来 ...
参考参考,有空慢慢搞。
AD7C | Amateur Radio Blog, Log, and Outdoor Adventures
http://www.ad7c.com/