**这是本文档旧的修订版!**
DDS+PWM产生任意波形
工作原理
- DDS部分
- PWM部分
- 模拟链路部分
模拟电路功能介绍
任意波形发生器模拟电路部分原理图
通过调节PWM的占空比(0.5V/3.3V ~ 3V/3.3V)得到等效幅度为0.5V - 3V之间的模拟信号,幅度变化的范围为2.5V,要得到幅度为5Vpp的模拟信号,则放大器的增益设定为G = 2: 也就是在电路原理图中放大器的增益为:R14/(R6+R7+R2) = 2 取R14 = 4.3KΩ,则R6+R7+R2 = 2.15KΩ PWM波形的中间值为(0.5V+3.0V)/2 = 1.75V,因此:
- 在PWM的输出为1.75V的时候,运算放大器的输出应为0V
- PWM的输出为0.5V的时候,运算放大器的输出为2.5V
- PWM的输出为3V的时候,运算放大器的输出为-2.5V
由此直流偏移的要求可以得到R10 + R13 = 6.5KΩ 同时R6、C6,R7、C7以及R14、C11共同构成低通滤波器。
能够生成模拟信号的最高频率 取决于PWM的主时钟频率,我们目前用的FPGA的输入时钟为12MHz,使用内部PLL以后可以得到12MHz倍数的时钟频率,最高可以到400MHz,我们取比较安全的中间值192MHz(12MHz * 16)作为PWM的主时钟。 假设DDS波表为10位精度(一般DDS信号发生器的精度,作为简易的口袋仪器,对性能指标要求不高,8位也能够满足要求),则对应于一个模拟电压值的PWM周期为192MHz/1024 = 155KHz 如果通过10个点
任意波形发生器模拟电路部分的仿真 - 频率响应(100Hz- 10MHz)
任意波形发生器模拟电路部分的仿真 - 波形(100KHz正弦波)
FPGA代码
DDS得到任意波形
调用DDS结果通过PWM生成需要的波形
//Generate AWG using 10bit resolution PWM + external RC LPF as DAC, up to 100KHz wire [9:0] PWM_WAV_in; assign PWM_WAV_in = sine_data[9:0]; reg [10:0] PWM_WAV_accumulator; always @(posedge clk_hs) PWM_WAV_accumulator <= PWM_WAV_accumulator[9:0] + PWM_WAV_in; assign pwm_awg = PWM_WAV_accumulator[10];