|
好久没来发帖,主要是近一年实在是在太忙了,玩的东西荒废好久。这两天终于有空玩还是受yi情影响,虽然不是隔离,但是被困在家里,闲着没事索性有空填了两个坑。
第一个已经发了,算是近古坑,刚挖了只一两个月就填了:做了一个低频ID卡/门禁卡读写复制器 支持偏频:https://www.mydigit.cn/thread-268309-1-1.html
本帖这个是个中古坑,挖了一年多,可算填了。还要好多远古坑不知道要什么时候有空填了,最近管kong开始逐步解除了,又得忙起来板砖干活了。
挖坑时间在一年半前
去年三月就开始画PCB了
前前后后改了三版 程序也断断续续写了好久
第一版奇怪的bug
第二版因为没有低功耗 设置关闭波形输出的时候整个升压系统和模拟系统都在供电,所以在电池应用里面实在是受不住
最终的第三版 又完全重新改了电源系统,加了电源路径管理 支持插外部电源时整体由外部电源供电,且在无波形输出时切断整个模拟域
原理图
考虑到25MHz的有源晶振价格比较高,所以使用了STM8的HSE作为晶振振荡器,直接给STM8超频连接25MHz的晶振,使用CKO时钟输出给AD9833提供时钟
这样25MHz无源晶振就非常便宜了,当然需要高精度的频率的话,PCB上也预留了有源晶振的位置
而STM8内部为了防止跑飞(实际上实测CPU直接跑26MHz也没什么事),CPU工作在25MHz/8=3.125MHz的频率,而外设全部工作在25MHz。
设计的七阶巴特沃兹低通滤波器,3dB通带带宽10MHz
因为设计就是低成本向的,元件选取上整体成本已经非常低了,整个上面最贵的就是AD9833主核心,模拟器件全是买拆机货,一两元还包邮。其他的东西都是东拼西凑拆的。屏幕是某垃圾店卖的IIC屏幕,当时买了10片一直没用
PCB图
正面去掉了影响按按键的元件,且加上按键丝印
背面电源管理完全重做 本来是不想用0402元件的
实在塞不下没办法只得用了 ,还用了sod302的小二极管 sot323的小三极管
实现的参数
支持波形:正弦波、锯齿波
输出正弦波3dB带宽:10Hz~10MHz
实际波形较好带宽:高速模式20Hz~8MHz 低速模式20Hz~10KHz
频率分辨率:高速模式0.1Hz 低速模式0.01Hz
频率精度:取决于晶振
数控可调幅度:-28dBV~+12dBV 相当于40mVpp~4Vpp ---》100倍可调范围
幅度调节步进:0.1dBV
数控可调偏移:-3.3V~+3.3V
偏移调节步进:0.01V
程序前前后后写了很久,最后这几天一口气写完了,极限优化下,把STM8的瘦小8K容量塞的满满当当一点不剩(当然再优化优化榨一榨还有可能在优化出一两百个bytes把)
flash占用刚好8192bytes 其中程序7Kb,字库1.5Kb。字库剩下的576bytes塞在容量640byte的EEPROM里面
flash区塞满证据
eepreom区还能再塞48bytes
-----------------我是分割线--------------------
实物 做了两个 正面 其中有一个屏幕还没贴胶
背面
电源部分特写
开机后页面:依次显示频率、系统电压、幅度、偏移、波形类型
开机不开波形输出时:耗电16mA
开启波形输出 耗电76mA
专门绘制的电池图标,长按最右边按键切换(自动记忆,下次上电保持设置)
电池图标:
直接显示电压
对于强迫症,增加一个一键归零调整模式,如果频率调的很乱,想要一次性弄成整数,不再需要一位一位的去调整归零!!
普通模式下:调节编码器只改变对应位,比如依次增加编码器
这时候长按向下键开启一键归零模式
再拧一格编码器,所有低于调整位的位数全部归零!!!强迫症福音有没有!!!!
甚至可以直接拧出9999999!而不需要在普通模式下一位一位的去调
-----------------------------我是分割线---------------------------
开始说波形发生性能
一、高频性能
设置幅度2V 6MHz下显示1.9V 此时频谱非常纯净
7MHz下显示1.84V
9MHz下已经可以看到起伏 ,幅度降到1.68Vpp,可以看到没滤干净的第二奈奎斯特区镜像频率分量了
10MHz时就更明显了,幅度降到1.48Vpp,这时候镜像分量更加大了
所以高频段虽然说DAC可以到二分之一采样率的输出,但是鉴于滤波器的过渡带宽度,其实一般只用到25MHz/3=8MHz以下的频率,保证三个以上采样点输出的正弦波效果才会好。
二、低频性能
由于AD9833单端输出转AD603差分输入有偏置的原因,所以在信号处理电路中加了一个隔直电容,虽然带宽已经非常小了,但是还是有影响
具体测得3dB带宽在10Hz
低频输出200Hz 幅度1.92V
低频输出100Hz 幅度1.92V
低频输出50Hz 幅度1.84V 开始有所下降 但是并不影响
低频输出30Hz 幅度1.74V
低频输出10Hz 幅度1.1V 达到-3dB
低频输出5Hz 幅度0.66V
三、增益性能
用AD603控制增益,增益可调范围为40dB,也就是100倍,基本上足够日常使用
幅度可调:-28dBV~+12dBV 相当于40mVpp~4Vpp
实际上由于AD603增益还是有些差异,所以我做的两个一个最高输出4V,一个只有3.6V。这种需要校准调整下,不属于原理问题,此处不详述
由于AD603是对数增益调整,所以实际调整显示的dB,在使用上有些反人类,所以要转换到电压显示。
让stm8这种小身板计算对数实在是过于为难 且对数库需要占用非常多空间,所以研究了下决定用线性插值。
打开matlab
画了下线性插值间距造成的误差
0.5dB插值间隔 到+12dBV误差可以控制在2mV以内
1dB插值间隔 到+12dBV误差可以控制在8mV以内。
实际上在高幅度区显示的是x.xxV,分辨率到10mV,所以用1dB间隔,精度也够了。低幅度区,更不影响了。
毕竟几mV的显示误差不值当浪费多一倍的空间
附上生成线性插值数组的代码:
- clc
- clear all
- begin_dBV = -40;
- end_dB = +20;
- dBV_Lin_0P5 = begin_dBV:1:end_dB;
- dBV_Lin_0P1 = begin_dBV:0.1:end_dB;
- mV_Lin_0P5 = 10.^(dBV_Lin_0P5/20) *1000;
- mV_Lin_0P1 = 10.^(dBV_Lin_0P1/20) *1000;
- Test_mV_Lin_0P5 = round(mV_Lin_0P5*10);
- Test_mV_Lin_0P1 = interp1(dBV_Lin_0P5,Test_mV_Lin_0P5,dBV_Lin_0P1,'linear');
- figure
- plot(dBV_Lin_0P1,mV_Lin_0P1-Test_mV_Lin_0P1/10);
- title('线性插值的误差');
- xlabel('输入对数电压 dBV');
- ylabel('输出误差 mV');
- fid=fopen('dB_data.txt','wt');
- fprintf(fid,'%g,',Test_mV_Lin_0P5);
- fclose(fid);
复制代码
以1KHz输出为例测试输出幅度调节
12dBV输出 理论4Vpp
10dBV输出
6dBV输出 理论2Vpp
0dBV输出 理论1Vpp
-6dBV输出 理论500mVpp
-12dBV输出 理论250mVpp
-20dBV输出 理论100mVpp
-28dBV输出 理论40mVpp 还是有一些噪声的
显示示波器频率计显示是不准的 因为这垃圾示波器他触发不了了
注意到由于运放的电压失调和PWM的精度问题,实际上这里的基线平均值为19mV (校准可以解决)
三角波的幅度性能
40mV
四、偏移性能
偏移0.5V
偏移1V
偏移2V
最大偏移3.3V
在最大偏移的时候开最大幅度是会出现削顶失真的 (因为顶到了电源轨) 使用时需要注意
四、低速高精度模式
由于在25MHz的时钟下输出频率分辨率只有约0.1Hz,所以如果给AD9833以25MHz的八分频时钟,可以得到约0.01Hz的分辨率
长按左键切换高速模式
长按右键切换低速模式 两个模式的频率各自保存 自动储存到EEPROM
在低速模式下可以实现频率微调
比如现在示波器显示999.970Hz
微调增加10mHz 示波器显示999.982Hz
微调增加40mHz 示波器显示1.00000KHz 满足强迫症的某些精确频率调控需求
当然低速模式也有问题,由于没有低通滤波器滤除第二奈奎斯特区的频率分量
大于10Khz的时候就不能用了,所以需要注意适用范围
比如低速模式100KHz,可以看到清晰的采样点
而高速模式则没什么问题
低速模式降低到10KHz,则没什么问题
next
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x
打赏
-
查看全部打赏
|