yanniwang

基于ADuC7060单片机的电子称设计

0
阅读(8017)

 目前,数字电子称是日常生活中上广泛使用的一种称量工具,但市场上使用的各式小量程电子称还存在一定的局限性,这些电子称体积大、成本高、计量误差大。本文提出的电子称选用ADI公司生产的ADUC7060模拟微控制器,设计一种体积小、低成本、计量精度高、工作可靠的小量程电子称。


1.系统构成
本系统由压力传感器、放大器电路、中央处理器、LCD 共5 大部分组成。
电子秤系统硬件如图1 所示它由传感器、A/D 转换和LCD显示器、单片机等构成。


 测量过程是把被测物体的重量通过传感器将重量信号转化为电压信号输出,信号调理把来自传感器微弱信号放大,放大后的电压信号经过模数转换把模拟量转换成数字量,数字量经过单片机数据处理,然后送液晶显示。

2.传感器选择
 电子称测量系统中,传感器是关键部件,其性能好坏决定了电子称的和精确度和稳定性。根据小量程电子称的设计要求, 设计中选用单点式荷重传感器LC8020,其精度0.03%,灵敏度2.0±0.2mV/V,额定量程5Kg,供桥电压5V。

3.微控制器选择
 ADuC7060是AD I公司生产的集成ARM7TDM I内核的精密数据转换器, 具有ARM7TDM I内核的编程能力, 集成了一个由ARM公司设计的16 /32位ARM7TDM IR ISC处理器内核, 输入支持多通道的24位sigma-deltaA /D 转换, 采样率高达2MSPS. 适用于高精密测量与控制, 以及具有基本数字编程要求的数据采集系统 .
由于ADuC7060把高速A /D转换、D /A 转换以及具有ARM7TDM I内核的微处理器集成在一个芯片内, 利用ADuC7060作为前端数据采集可以缩小数据采集系统体积, 简化电路, 提高模拟通道的信噪比和降低系统成本。
附AD转换部分软件调试程序:
 #define BIT0  0x01

#define BIT1  0x02

#define BIT2  0x04

#define BIT4  0x10

#define BIT7  0x80

#define BIT8  0x100

#define BIT10  0x400

#define BIT15  0x8000

 

#include<aduc7060.h>            //包含ADuC7060头文件

void delay (int length) ;           //声明延时函数

void senddata(int to_send);             //声明串口发送函数

volatile int Temp;

volatile int Temp2;      

 

/*******************************************************************************

函数名称:main()

函数功能:配置主ADC单端模式转换,并将转换结果通过串口发出

******************************************************************************/

int main(void)

{

    POWKEY1 = 0x1;

POWCON0 = 0x78;          //设置CPU内核时钟最大到10.24MHZ

    POWKEY2 = 0xF4;

   

    /*初始化UART串口*/

    GP1CON |= BIT0 + BIT4;    // 硬件接口选择P1.0和P1.1

COMCON0 = BIT7;        

    COMDIV0 = 0x21;          //设置波特率为9600bps

    COMDIV1 = 0x00;

COMCON0 = BIT0 + BIT1 + BIT2;

 

    /*初始化ADC1*/

ADCMSKI = BIT1;          // 使能ADC转换完成中断

ADCFLT = 0x7;             // 1Khz 转换频率, 斩波关

    ADCMDE = BIT0+BIT7;      // ADC连续转换,正常模式

    ADC1CON =BIT7 + BIT8     // ADC1 输入通道选择ADC8/ADC9 差分模式

            + BIT11+BIT15 ;    //单极性编码输出,辅助ADC使能

ADCCFG = 0;            

IRQEN = BIT10 ;           // 使能ADC1 中断

 

    while (1)

    {

           GP1DAT=0x40000000;       //指示灯亮,进入循环

        senddata(Temp);            //将转换结果按位从串口发出

           delay (200000)         ;        //延时便于观察结果

         }

}

/*******************************************************************************

函数名称:senddata ()

函数功能:将24位AD转换结果每8位一组发出

******************************************************************************/

void senddata(int to_send)

{

    while(!(0x020==(COMSTA0 & 0x020))){}

        COMTX = 0x0A;                                 // 输出0A

    while(!(0x020==(COMSTA0 & 0x020))){}

        COMTX = 0x0D;                                 // 输出0D

    while(!(0x020==(COMSTA0 & 0x020))){}

        COMTX = ((to_send >> 24) & 0xFF);       //输出24~31位

    while(!(0x020==(COMSTA0 & 0x020))){}

        COMTX = ((to_send >> 16) & 0xFF);       //输出16~23位

    while(!(0x020==(COMSTA0 & 0x020))){}

        COMTX = ((to_send >> 8) & 0xFF);          //输出8~15位

    while(!(0x020==(COMSTA0 & 0x020))){}

        COMTX = (to_send & 0xFF);                     //输出0~7位

}                                                                                 

/*******************************************************************************

函数名称:delay()

函数功能:延时等待

******************************************************************************/

void delay (int length)

{

while (length >=0)

    length--;

}

/*******************************************************************************

函数名称:IRQ_Handler()

函数功能:ADC1中断服务程序

******************************************************************************/

void IRQ_Handler(void) __irq

{

    unsigned long IRQSTATUS = 0;

    IRQSTATUS = IRQSTA;                //读出中断状态寄存器值

    if ((IRQSTATUS & BIT10) == BIT10)     //判断ADC1转换完成触发中断

    {        

                   Temp2 = ADC0DAT;              //读出主ADC转换结果

                   Temp= ADC1DAT;               //读出辅助ADC转换结果

         }

}