📄 a_d(d_a)converters.c
字号:
/* adc.c - successive approximation A/D converter */
#include <math.h>
double dac();
int u();
void adc(x, b, B, R)
double x, R;
int *b, B;
{
int i;
double y, xQ, Q;
Q = R / pow(2, B); /* quantization width \(Q=R/2\sp{B}\) */
y = x + Q/2; /* rounding */
for (i = 0; i < B; i++) /* initialize bit vector */
b[i] = 0;
b[0] = 1 - u(y); /* determine MSB */
for (i = 1; i < B; i++) { /* loop starts with \(i=1\) */
b[i] = 1; /* turn \(i\)th bit ON */
xQ = dac(b, B, R); /* compute DAC output */
b[i] = u(y-xQ); /* test and correct bit */
}
}
/* dac.c - bipolar two's complement D/A converter */
double dac(b, B, R)
int *b, B; /* bits are dimensioned as \(b[0], b[1], \dotsc, b[B-1]\) */
double R;
{
int i;
double dac = 0;
b[0] = 1 - b[0]; /* complement MSB */
for (i = B-1; i >= 0; i--) /* H\"orner's rule */
dac = 0.5 * (dac + b[i]);
dac = R * (dac - 0.5); /* shift and scale */
b[0] = 1 - b[0]; /* restore MSB */
return dac;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -