2、PWM信号变成直流信号主要有两种方法,第一种:用多级RC滤波电路(一般2-3级RC滤波即可),可以变成直流,这种方法比较简单,但是,输出阻抗大,不能带负载。第二种方法:用运放构成的有源滤波器来滤波,这种方法效果好,输羡厅羡出阻抗小,就是电路稍微复杂了点,而且要一些计算。用一个单运放就可以实现3级滤波。但是要注伏中意运放的选择,如果是单电源供电的话,运放要采用Rail-to-Rail的运放。
PWM是通过改变占空比来改变核晌输出电压的有效值的,即改变输出电压的大小.假设单片机的电源电压为5V,并假设输出高电平也为5V.
当PWM的占空比为100%时,输出电压有效值为5V,当占空比为0时,输出电压有效值为0V,当占空比为50%时,输出电银搭压有效值为2.5V,以此类推.当然以上为理论上的值,实际使用时PWM频率要适当高些,同时在输出并上改搏锋个电容,让输出电压较平稳而不至于真的是个脉冲.
当然,这种DA的精度是不高的,用于要求不高的场合,如果要求精度较高的时候,要用到外部DA芯片,关于这个,见参考文献P286,这里有详细的线路与程序,及其原理说明等。
FPGA是不能实现DA转码蚂换的,它内部处理的都是数字信号,不能输出模拟信号。一般是用FPGA控制系统工作流程,产生控制信号,DSP输出数字信号处理后得到的数字信号,经专门的DA芯片,如PCM1798、1794、AD1955、CS4398、AK4396、AK4399等等,FPGA只能实现特定类轿行型的脉冲,如下:library ieee
use ieee.std_logic_1164.all
use ieee.std_logic_arith.all
use ieee.std_logic_unsigned.all
entity dac_ds is
port(reset :in std_logic
clk :in std_logic
din :in std_logic_vector(7 downto 0)--Signed integer
dout :out std_logic)
end dac_ds
architecture arch_dac_ds of dac_ds is
signal error :std_logic_vector(9 downto 0)--Error accumulator is 2 bits larger
constant zeros:std_logic_vector(7 downto 0):=(others=>'0')
begin
process(reset,clk,din)
variable val :std_logic_vector(9 downto 0)
begin
if reset='1'then
error<=(others=>'闭模哗0')
dout<='0'
elsif clk'event and clk='1' then
--val:=din+errordin is sign extended to nbits+2
val:=(din(din'high)&din(din'high)&din)+error
if val(val'high)='0'then
dout<='1'
error<=val+("11"&zeros)
else
dout<='0'
error<=val+("01"&zeros)
end if
end if
end process
end arch_dac_ds
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)