ATMega8 查询方式 A/D转换测试程序
来源: 芯艺工作室
本站广告
  ENC28J60+uIP DHCP动态获取IP及UDP广播服务端示例
  ENC28J60+uIP 基于TCP的MODBUS IO示例
  C720H5上实现MODBUS远程IO
  ENC28J60+uIP HTTP GET方式将温度数据上传到web服务器
  FM1702读写S50(也叫M1)卡相关资料


/********************************
  ATMega8 查询方式 A/D转换测试程序
  文件名:main.c
  编译:WinAVR-20070122

  硬件环境:CA-M8X   打开的开关如下
            S6(1,2) - 外部4MHz晶振
            S1(7) - PC0连接电位器
            S5(5,6) - UART通信
  
  芯艺设计室 2004-2007  版权所有 
  转载请保留本注释在内的全部内容
  WEB: http://www.chipart.cn
  Email: changfutong@sina.com
*******************************/

#include <avr/io.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdint.h>

static uint16_t g_aAdValue[8];  //A/D转换缓冲区

void IoInit(void);//debugprint.c中实现

//AD转换8次去掉最高和最低后取平均值返回
uint16_t AdcConvert(void)
{
  uint8_t i;
  uint16_t ret;
  uint8_t max_id,min_id,max_value,min_value;
  
  ADMUX=0Xc0;//内部2.56V参考电压,0通道
  ADCSRA=_BV(ADEN);//使能ADC,单次转换模式
  
  //连续转换8次
  for(i=0;i<8;i++)
  {
    ADCSRA|=_BV(ADSC);
    _delay_loop_1(60);
    while(ADCSRA&_BV(ADSC))
      _delay_loop_1(60);
    ret=ADCL;
    ret|=(uint16_t)(ADCH<<8);
    g_aAdValue[i]=ret;
  }
  ret=0;
  for(i=1;i<8;i++)
    ret+=g_aAdValue[i];
  
  //找到最大和最小值索引  
  ret/=7;
  max_id=min_id=1;
  max_value=min_value=0;
  for(i=1;i<8;i++)
  {
    if(g_aAdValue[i]>ret)
    {
      if(g_aAdValue[i]-ret>max_value)
      {
        max_value=g_aAdValue[i]-ret;
        max_id=i;
      }
    }
    else
    {
      if(ret-g_aAdValue[i]>min_value)
      {
        min_value=ret-g_aAdValue[i];
        min_id=i;
      }
    }
  }
  
  //去掉第一个和最大最小值后的平均值
  ret=0;
  for(i=1;i<8;i++)
  {
    if((i!=min_id)&&(i!=max_id))
      ret+=g_aAdValue[i];     
  }
  if(min_id!=max_id)
    ret/=5;
  else  
    ret/=6;

  ADCSRA=0;//关闭ADC
  
  return ret;
}

int main(void)
{
  uint8_t i;
  IoInit();
  
  while(1)
  {
    scanf("%c",&i);
    if(i=='c')
      printf("%d\n",AdcConvert());
  }
}


debugprint.c

/********************************
  UART初始化并设置标准I/O流
  文件名:debugprint.c
  编译:WinAVR-20070122

  硬件:CA-M8X  
  
  芯艺设计室 2004-2007  版权所有 
  转载请保留本注释在内的全部内容
  WEB: http://www.chipart.cn
  Email: changfutong@sina.com
*******************************/

#include <avr/io.h>
#include <stdio.h>

static int uart_putchar(char c, FILE *stream);
static int uart_getchar(FILE *stream);

static FILE mystd = FDEV_SETUP_STREAM(uart_putchar, uart_getchar,_FDEV_SETUP_RW);

static int uart_putchar(char c, FILE *stream)
{
  if (c == '\n')
    uart_putchar('\r', stream);
  loop_until_bit_is_set(UCSRA, UDRE);
  UDR = c;
  return 0;
}

static int uart_getchar( FILE *stream)
{
  loop_until_bit_is_set(UCSRA,RXC);
  return UDR;
}

//接口函数
void IoInit(void)
{
  //初始化uart,查询方式读写
  UCSRB=_BV(RXEN)|_BV(TXEN);/*(1<<RXCIE)|(1<<TXCIE)|*/
  UBRRL=25;  //9600 baud 4MHz:25  
  
  stdout=&mystd;
  stdin=&mystd;
}







声明:芯艺工作室(http://www.chipart.cn)保留所有权力,转载请注明出处!

芯艺工作室    蒙ICP备06005492号

Copyright© 2004-2020 ChipArt Studio All Rights Reserved