The source file
Explanations
#include < stdio.h>
#include < stdlib.h>
main() {
  //Simulation of synchronous DA control
  double period=3600, delay_time;
#define NCH 12
  int from[NCH], to[NCH], acc[NCH],dacvalue[NCH],dif[NCH],dir[NCH];
  int ich,chm;
  int md,is,nch=5;
適当に初期値と終了値をセットしてください。プログラムの中では
このなかでnch分が捜査の対象になります。
  from[ 0]= 1000;  to[ 0]= 1000;
  from[ 1]= 1000;  to[ 1]= 1200;
  from[ 2]= 1000;  to[ 2]=  900;
  from[ 3]= 1000;  to[ 3]=  999;
  from[ 4]= 1000;  to[ 4]= 1001;
  from[ 5]= 1000;  to[ 5]= 1000;
  from[ 6]= 3000;  to[ 6]= 5000;
  from[ 7]= 1000;  to[ 7]= 1000;
  from[ 8]= 2000;  to[ 8]= 1001;
  from[ 9]= 1000;  to[ 9]= 1200;
  from[10]= 1000;  to[10]=    0;
  from[11]= 1500;  to[11]= 1000;

まず最大ステップを探します。
  chm=0;
  for(ich=0;ich abs(to[chm]-from[chm])) chm=ich;
  }

ADCにセットする値の変化の絶対値の最大を調べます。
これが最後のループのステップ数になります。
  md=abs(to[chm]-from[chm]);
  if(md==0) { 
    printf("No need to change DAC\n"); 
    exit(0); 
  }
  printf("Change %d DACs    from     to in %.1f seconds\n",nch,period);

「変化させる時間/変化の絶対値」がこのプログラムが動く
ステップの間隔を決定します。
  delay_time=period/abs(md);  

各チャネル用にACCと言う変数を使うところが
味噌です。 初期値は「ステップ数/2」です。
  for(ich=0;ich < nch;ich++) {
    acc[ich]=md/2; 
    dacvalue[ich]=from[ich];
    dif[ich]=to[ich]-from[ich];
    dir[ich]=(dif[ich]>0)? 1:-1;

  }

  printf("DAC will be controled in %.1f msec step total %d steps\n", delay_time*1000, md);  

ループです。
  for(is=0;is < md;is++) {
    printf("%6d",is);
    for(ich=0;ich < nch ;ich++) { 
ACCにそのチャネルの「変化量」をたします。
      acc[ich]=acc[ich]+abs(dif[ich]);
もし結果が「ステップ数以上ならば」
      if (acc[ich] > = md) {
DACの値を1増やします。
	dacvalue[ich]=dacvalue[ich]+dir[ich];
ACCをMDのあまりにします。
	acc[ich]=acc[ich]-md;
      }
      printf("%6d",dacvalue[ich]);
    }
次のステップまで一定時間休みます。  
    //    sleep_system(delay_time); 
    printf("\n");
  }
}