a_d(d_a)converters.c

来自「有两个函数分别实现模数和数模转换功能的源程序」· C语言 代码 · 共 54 行

C
54
字号
/* 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 + =
减小字号Ctrl + -
显示快捷键?