⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 adc.lst

📁 基于陀螺仪原理的惯性导航程序 用于测量量角速度
💻 LST
📖 第 1 页 / 共 2 页
字号:
ARM COMPILER V2.53,  ADC                                                                   22/09/07  23:08:05  PAGE 1   


ARM COMPILER V2.53, COMPILATION OF MODULE ADC
OBJECT MODULE PLACED IN ADC.OBJ
COMPILER INVOKED BY: D:\Keil\ARM\BIN\CA.exe ADC.c ARM BROWSE DEBUG TABS(4) 

stmt  level    source

    1          /**********************************************************************
    2            ADC.c file
    3            ADuC7020的ADC函数
    4            作者:lig&lij
    5            建立日期:2006-4-25
    6            修改日期:2006-4-25
    7            版本:V1.0
    8          **********************************************************************/
    9          
   10          #include "My_type.h"
   11          #include <ADuC7020.H>
   12          #include "ADC.h"
   13          #include "others.h"
   14          ////////////////////////由软件启动一次转换,并将ADC结果返回//////////////////////////
   15          uint16 ADC_software_conversion(void)
   16          {
   17   1       uint16 result;
   18   1      
   19   1       ADCCON=0x00A3;             //开始一次软件启动转换
   20   1       while(!(ADCSTA & 0x01));   //等待转换完成
   21   1       ADCCON=0x0020;             //停止转换
   22   1       WatchDog();
   23   1       result=ADCDAT>>16;         //保存结果
   24   1       return result;             //返回结果
   25   1      }
   26          /////////////////////////////////////////////////////////////////////////////////////
   27          
   28          /////////////////////////////ADC校准/////////////////////////////////////////////////
   29          void ADC_calibration(void)
   30          {
   31   1       uint16 i;
   32   1       uint16 result;
   33   1      
   34   1       ADCCP=0x11;               //将输入接内部地
   35   1       for(i=0;i<0x03FF;i++)     //零点偏移校准
   36   1        {
   37   2         ADCOF=i;                //设置ADCOF的值
   38   2         result=ADC_software_conversion();     //读回ADC的值
   39   2         if(result==0x01)
   40   2          {                                    //校验到的结果为1时,往回调整一点,就是0了
   41   3           ADCOF=i-3;
   42   3           break;
   43   3          }
   44   2        }
   45   1       ADCCP=0x12;   //将输入连接到内部参考电压
   46   1       for(i=0;i<0x03FF;i++)        //增益校准
   47   1        {
   48   2         ADCGN=i;    //设置ADCGN的值
   49   2         result=ADC_software_conversion();
   50   2         if(result==4094)
   51   2          {                                 //校验结果为4094
   52   3            ADCGN=i+6;                      //再将ADCGN加的一点
   53   3            result=ADC_software_conversion();
   54   3            if(result==4095)
   55   3             {                     //如果读回的值为4095,则说明往增大的方向调整一点就是满量程了
   56   4              ADCGN=i+4;
   57   4              break;
   58   4             }
   59   3            else
ARM COMPILER V2.53,  ADC                                                                   22/09/07  23:08:05  PAGE 2   

   60   3             {                   //否则,应该按相反的方向调整一点
   61   4              ADCGN=i-4;
   62   4             }
   63   3          }
   64   2        }
   65   1      }
   66          //////////////////////////////////////////////////////////////////////////////////
   67          
   68          ////////////////////////////ADC初始化/////////////////////////////////////////////
   69          void ADC_init(void)
   70          {
   71   1       ADCCON=0x0023;    //ADC时钟1MHz,打开ADC电源,单端模式,并选择软件转换模式
   72   1       ADCCP=0x00;       //通道0
   73   1       ADCCN=0x00;       //通道0
   74   1       REFCON=0x01;      //使用内部2.5V参考电压
   75   1       ADC_calibration();  //ADC校准
   76   1       ADCCP=0x00;      //选择通道0
   77   1      }
   78          //////////////////////////////////////////////////////////////////////////////////
   79          
   80          
   81          //////////////////////////选择通道ch,启动转换,并将ADC结果返回///////////////////
   82          uint16 read_ADC(uint8 ch)
   83          {
   84   1       ADCCP=ch & 0x1F;      //设置通道
   85   1       return ADC_software_conversion();
   86   1      }
   87          //////////////////////////////////////////////////////////////////////////////////
ARM COMPILER V2.53,  ADC                                                                   22/09/07  23:08:05  PAGE 3   

ASSEMBLY LISTING OF GENERATED OBJECT CODE



*** PUBLICS:
 PUBLIC         ADC_init?A
 PUBLIC         read_ADC?A
 PUBLIC         ADC_software_conversion?A
 PUBLIC         ADC_calibration?A



*** CODE SEGMENT '?PR?ADC_software_conversion?A?ADC':
   16: {
 00000000            ; SCOPE-START
   19:  ADCCON=0x00A3;             //开始一次软件启动转换
 00000000  E3A010A3  MOV         R1,#0xA3
 00000004  E5100000  LDR         R0,=0xFFFF0500
 00000008  E5801000  STR         R1,[R0,#0x0]
   20:  while(!(ADCSTA & 0x01));   //等待转换完成
 0000000C          L_1:
 0000000C  E5100000  LDR         R0,=0xFFFF050C
 00000010  E5900000  LDR         R0,[R0,#0x0]
 00000014  E3100001  TST         R0,#0x0001
 00000018  0AFFFFFB  BEQ         L_1  ; Targ=0xC
   21:  ADCCON=0x0020;             //停止转换
 0000001C  E3A01020  MOV         R1,#0x20
 00000020  E5100000  LDR         R0,=0xFFFF0500
 00000024  E5801000  STR         R1,[R0,#0x0]
   22:  WatchDog();
 00000028  E3A01A01  MOV         R1,#0x1000
 0000002C  E5100000  LDR         R0,=0xFFFF0360
 00000030  E5801000  STR         R1,[R0,#0x0]
 00000034  E3A010FF  MOV         R1,#0xFF
 00000038  E5100000  LDR         R0,=0xFFFF036C
 0000003C  E5801000  STR         R1,[R0,#0x0]
   23:  result=ADCDAT>>16;         //保存结果
 00000040  E5100000  LDR         R0,=0xFFFF0510
 00000044  E5901000  LDR         R1,[R0,#0x0]
 00000048  E1A01821  MOV         R1,R1,LSR #16
 0000004C  E1A01801  MOV         R1,R1,LSL #16
 00000050  E1A01821  MOV         R1,R1,LSR #16
 00000054  ---- Variable 'result' assigned to Register 'R1' ----
   24:  return result;             //返回结果
 00000054  E1A00001  MOV         R0,R1 ; result
 00000058  E1A00800  MOV         R0,R0,LSL #16 ; result
 0000005C  E1A00820  MOV         R0,R0,LSR #16
 00000060            ; SCOPE-END
   25: }
 00000060  E12FFF1E  BX          R14
 00000064          ENDP ; 'ADC_software_conversion?A'


*** CODE SEGMENT '?PR?ADC_calibration?A?ADC':
   29: void ADC_calibration(void)
 00000000  E92D4010  STMDB       R13!,{R4,LR}
   30: {
 00000004            ; SCOPE-START
   34:  ADCCP=0x11;               //将输入接内部地
 00000004  E3A01011  MOV         R1,#0x11
 00000008  E5100000  LDR         R0,=0xFFFF0504
 0000000C  E5801000  STR         R1,[R0,#0x0]
   35:  for(i=0;i<0x03FF;i++)     //零点偏移校准
 00000010  E3A04000  MOV         R4,#0x0
 00000014  E1A03004  MOV         R3,R4 ; i
 00000018  ---- Variable 'i' assigned to Register 'R3' ----
 00000018  EA000015  B           L_8  ; Targ=0x74
 0000001C          L_9:
   37:    ADCOF=i;                //设置ADCOF的值
 0000001C  E1A00003  MOV         R0,R3 ; i
 00000020  E1A01800  MOV         R1,R0,LSL #16 ; i
ARM COMPILER V2.53,  ADC                                                                   22/09/07  23:08:05  PAGE 4   

 00000024  E1A01821  MOV         R1,R1,LSR #16
 00000028  E5100000  LDR         R0,=0xFFFF0534
 0000002C  E5801000  STR         R1,[R0,#0x0]
   38:    result=ADC_software_conversion();     //读回ADC的值
 00000030  EBFFFFF2  BL          ADC_software_conversion?A  ; Targ=0x0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -