龙空技术网

记录一下STM32做的双路DDS信号发生器模块设计过程

电源网论坛 522

前言:

如今朋友们对“stm32f103 dac精度”大体比较关心,看官们都需要剖析一些“stm32f103 dac精度”的相关内容。那么小编也在网络上网罗了一些关于“stm32f103 dac精度””的相关文章,希望我们能喜欢,姐妹们一起来学习一下吧!

前言:

最近带学生要做一个正弦波测试电源的课题,用来作为单相电表的测试电源。电表出厂的时候要校准。比如一个220V/50A的电表,电网的电压不一定是标准220v,可能是200v有时候也可能240v,这都是很正常的。再说电流,如果小功率电器,比如5w的手机充电器,那么电流大概只有0.02A,如果是一台3KW的热水器,电流大概就会有15A。所以电表出厂时要测试各种负载情况下的电压电流就不可能用固定的负载测试。在已知电压电流的情况下检查电表的读数,这就可以知道电表是否准确了。这时候就要用到交流测试电源了。

刚开始我也很困惑,根据欧姆定律电源不是可以输出电压和电流吗?怎么电压一路,电流一路呢?比如我们测试220V/50A情况下电表精度的时候不可能找一个11KW的电器接在标准的220v电压上让你去测试啊!而且下感性或容性负载情况下电流电压有相移也是模拟不了的。这样就必须有两路电源让电压和电流分别被电表芯片测量到形成功率数据。这样就是我们需要做的单相交流测试电源了!

我们正常使用电表时电压从电表的输入端会送到内部变压器进行降压整流滤波后给电表的芯片和液晶供电,另外电表内部也会有一个分压电路把220V的输入电压用电阻分压后送给电表芯片采集电压。单相表的电流采样一般会使用锰铜片作为采样电阻,电流流过锰铜片会产生压降,把这个信号送给电表芯片计算电流。

所以我们要做两路独立的电源,一路加在电表的进线端,另一路加在电表中锰铜片两端。这样没有负载,电表也可以显示电压、电流和功率数据。听到这里估计很多人都已经明白了。

来我们看一下下图单相电表的正常使用中的接法和用单相交流测试电源的接法示意图。

我们的交流测试源要求电压、电流两路隔离输出。而且电压输出是恒压,电流输出作为恒流输出。

交流测试源要求:

电压源功率20W,电流源功率20W,电压电流相互独立采用C型卧式变压器隔离;输出失真度由于0.1%;频率45.00-65.00HZ,最小步进0.01HZ,精度0.01HZ;电压输出0-220V可调,最小步进0.1%,精度0.1%;电流输出分为0-50A档,最小步进0.1%,精度0.1%;电流相对于电压的相位0-360°可调,最小步进0.01°,精度0.05°。

我们给出的方案就是用单片机产生两路频率、相位、幅值可调的正弦波信号。将正弦波信号分别送给两个功放模块然后经过变压器升压或升流。变压器有内阻,所以升压升流后的电压电流会随负载的增大而减小。此时通过电压、电流互感器采样后反馈给功放模块的前级运放做负反馈,调节负反馈的深度从而达到负载变化输出端稳定的状态。

问题的关键就在于这个信号发生器,如何用单片机产生两路频率、相位、幅值都可调的正弦波呢?首先我们想到了STM32F103RCT6单片机,它有串口、IIC接口、1路12位的DAC(2通道),并且有72M高频运行速度。这样太合适不过了。

正题:

以下部分我们主要研究STM32的信号发生器,信号发生器做好了这个项目基本就没什么问题了。首先我们分析STM32单片机12位的DAC数据是0-4095,对于0.1%的幅值步进是绝对没有问题的。72M主频,开一个360K的定时器中断来输出波形数据也是绝对没有问题的。比如要输出50HZ正弦波,360K/50=7200,就是说每个周期细分7200个数据,那么这样的正弦波的失真度绝对也是可以达到要求的。那么我们就运用FPGA课程里面学习的DDS原理,做出频率可调相位可调的波形。

接下来我们先写个固定频率的程序,输出几个不同频率的正弦波看下情况。

45HZ固定频率、100%幅值的正弦波:

50HZ固定频率、100%幅值的正弦波:

65HZ固定频率、100%幅值的正弦波:

50HZ固定频率、1%幅值的正弦波:

50HZ固定频率、10%幅值的正弦波:

50HZ固定频率、30%幅值的正弦波:

50HZ固定频率、50%幅值的正弦波:

50HZ固定频率、80%幅值的正弦波:

双通道50HZ、100%幅值、0°相位:

双通道50HZ、100%幅值、180°相位:

双通道50HZ、电压100%幅值、电流1%、0°相位:

双通道50HZ、电压100%幅值、电流10%、0°相位:

双通道50HZ、电压100%幅值、电流50%、0°相位:

双通道50HZ、电压100%幅值、电流100%、120°相位:

接下来就是如何调频了,这个缺点麻烦,不太容易理解。这里我先卖个关子,我们先继续进行实验。实验发现这个基于单片机原理的DDS信号发生器性能还是不错的,频率做到10K波形依然挺稳定。那么我们做这个信号发生器就不仅限于这个交流测试源了啊。开心!我们先把这个信号源优化一下,调整好性能参数后,以后可能其他课题项目也会用到的。那么我们重新调整一下信号发生器的参数,经测试在没有滤波的情况下2K以下的波形都是非常漂亮的。考虑到后期加滤波情况,我们将频率限制在20KHZ。考虑到多用途情况又增加了三角波、锯齿波、方波,随后看看能不能把自定义波形加里面及任意波,这个难度似乎有点大,还在思考之中!

似乎在一定程度上(低频情况)可以替代AD9850、AD9833、AD9834这种专业级的DDS芯片的。当然20KHZ以上的波形产生我们这个方案是肯定不行的。但是能替代一部分需求也是不错的,想想就来劲,开干!

最终给出新的参数:

·频率0-20KHZ,步进0.01HZ,两路波形允许输出不同频率波形;

·相位0-360°可调,最小步进0.01°,相位调节只在两路波形频率相同时生效;

·幅值0-100%可调,最小步进0.1%;

·正弦波、方波、三角波、锯齿波,四种波形可选;

·IIC、串口通信,每个芯片可以设置不同地址,以便输出多路正弦波使用。

那么我们来拟定一个通信协议吧,串口通信简单,先做串口部分吧。看下图:

/******************************************数据举例******************************************/

//地址清零

FA AF FE

//设置有返回数据

FA 00 A1 01 FE

//软复位

FA 00 A2 FE

//设置模块地址为0

FA 00 A3 00 FE

//设置通道1输出1234.56HZ,幅值1000,正弦波

FA 00 A4 01 00 12 34 56 FE

FA 00 A5 01 10 00 FE

FA 00 A7 01 01 FE

//设置通道2输出1234.56HZ,幅值1000,正弦波

FA 00 A4 02 00 12 34 56 FE

FA 00 A5 02 10 00 FE

FA 00 A7 02 01 FE

//设置通道2输出相位180°

FA 00 A6 02 01 80 00 FE

由于我不会做上位机,所以只能用串口调试助手测试,用起来还是比较麻烦的。所以希望会做上位机的网友给做一个简单的上位机吧,谢谢了!我给出一个示意图:

我先把HEX文件附上去,等IIC、自定义波形程序、上位机弄好再把源代码附上来!

标签: #stm32f103 dac精度 #stm32f103的dac