c语言锯齿波发生函数 锯齿波c语言程序

基于单片机的波形发生器设计 , C语言程序 , 有个很小的问题,求解决void juchi() //锯齿波函数
{uchar i;
for(i=0;i255;i++)
{DAC0832=i;
dump(10+p);}//延时实现频率可调,p是变量
i=0x00;}
void zhengxian()
{
for(i=0;i256;i++)//i没有声明 上面那个程序都有uchar i; uchar类型的最大值也只有255
{DAC0832=sin[i];//查表取值
dump(2+p);
}
i=0;
}
//最简单的方法就是复制juchi这个函数
//把DAC0832=i;改成DAC832=sin[i];就能看到效果了
void zhengxian() //正弦波函数
{uchar i;
for(i=0;i255;i++)
{DAC0832=sin[i];
dump(10+p);}//延时实现频率可调,p是变量
i=0x00;}
DAC0832的输出形式 如图9-58所示, 由运算放大器进行电流→电压转换,使用内部反馈电阻 。输出电压值VOUT和输入数字量D的关系:
VOUT = - VREF ×D/256
D = 0~255,VOUT = 0 ~ - VREF ×255/256
VREF = -5V,VOUT =0~5×(255/256)V
VREF = +5V, VOUT = 0 ~ -5×(255/256)V 如果实际应用系统中要求输出模拟电压为双极性 , 则需要用转换电路实现 。如图9-59所示 。
其中 R2=R3=2R1
VOUT= 2×VREF×D/256 -VREF= (2D/256-1)VREF
D = 0, VOUT= -VREF;
D = 128, VOUT= 0;
D = 255 ,  VOUT= (2×255/256-1)×VREF= (254/255)VREF
【c语言锯齿波发生函数 锯齿波c语言程序】即:输入数字为0~255时,输出电压在- VREF ~+ VREF之间变化 。
1. 运算放大器
运算放大器有三个特点:
⑴开环放大倍数非常高,一般为几千,甚至可高达10万 。在正常情况下 , 运算放大器所需要的输入电压非常小 。
⑵输入阻抗非常大 。运算放大器工作时,输入端相当于一个很小的电压加在一个很大的输入阻抗上,所需要的输入电流也极小 。
⑶输出阻抗很?。?所以,它的驱动能力非常大 。
2.由电阻网络和运算放大器构成的D/A转换器
利用运算放大器各输入电流相加的原理,可以构成如图10.7所示的、由电阻网络和运算放大器组成的、最简单的4位D/A转换器 。图中,V0是一个有足够精度的标准电源 。运算放大器输入端的各支路对应待转换资料的D0,D1,… , Dn-1位 。各输入支路中的开关由对应的数字元值控制,如果数字元为1 , 则对应的开关闭合;如果数字为0,则对应的开关断开 。各输入支路中的电阻分别为R , 2R,4R,…这些电阻称为权电阻 。
假设,输入端有4条支路 。4条支路的开关从全部断开到全部闭合,运算放大器可以得到16种不同的电流输入 。这就是说,通过电阻网络,可以把0000B~1111B转换成大小不等的电流 , 从而可以在运算放大器的输出端得到相应大小不同的电压 。如果数字0000B每次增1,一直变化到1111B,那么,在输出端就可得到一个0~V0电压幅度的阶梯波形 。
3.采用T型电阻网络的D/A转换器
从图10.7可以看出,在D/A转换中采用独立的权电阻网络,对于一个8位二进制数的D/A转换器,就需要R,2R,4R,…,128R共8个不等的电阻,最大电阻阻值是最小电阻阻值的128倍,而且对这些电阻的精度要求比较高 。如果这样的话,从工艺上实现起来是很困难的 。所以,n个如此独立输入支路的方案是不实用的 。
在DAC电路结构中,最简单而实用的是采用T型电阻网络来代替单一的权电阻网络,整个电阻网络只需要R和2R两种电阻 。在集成电路中,由于所有的组件都做在同一芯片上,电阻的特性可以做得很相近,而且精度与误差问题也可以得到解决 。
图10.8是采用T型电阻网络的4位D/A转换器 。4位元待转换资料分别控制4条支路中开关的倒向 。在每一条支路中,如果(资料为0)开头倒向左边,支路中的电阻就接到地;如果(资料为1)开关倒向右边,电阻就接到虚地 。所以,不管开关倒向哪一边,都可以认为是接“地” 。不过,只有开关倒向右边时,才能给运算放大器输入端提供电流 。

推荐阅读