• MSP430:AD10


    使用的MSP430G2553,为AD10,正常有8路输出,P1.0-P1.7为A0-A7

    有七个寄存器,

    参考电压可以是VCC或者内部参考电压1.5V或者2.5V

    参考时钟可以是内部ADC10OSC

    最高转换速率达200ksps

    转换方式四种:单通道单次,序列通道单次,单通道多次,序列通道多次。多次转换时候会用到DTC功能防止数据还没被取出就被覆盖

    单通道的实例程序,开启的为通道5,也就是P1.5

     1 void AD_Channel5_Config(void)
     2 {
     3   /* Configure ADC  Channel */
     4   ADC10CTL1 = INCH_5 + ADC10DIV_0 ;         // Channel 5, ADC10CLK
     5 
     6 
     7   ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE + REF2_5V;
     8   //SREF_1+REFON +REF2_5V 表示使用内部参考电压  2.5v
     9   ADC10AE0 |= BIT5;                         //P1.5 ADC option
    10 
    11 }
    单通道单次

    每次开始转换需要给寄存器置位,写了个小函数

    1 void AD_Start(void)
    2 {
    3     ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion
    4 }
    开始转换

    转换后的数据处理

     1 #pragma vector=ADC10_VECTOR
     2 __interrupt void ADC10_ISR (void)
     3 {
     4     int data ;
     5     float shuju,c;
     6     char a[4];
     7     data = ADC10MEM;
     8     shuju =  ((double)data/1024)*2.5;
     9     c =shuju;
    10     a[0]= ((int)c%10+0x30);
    11     a[1]= 0x2e;
    12     a[2]=  ((int)(c*10)%10+0x30);
    13     a[3]=  ((int)(c*100)%10+0x30);
    14 
    15     uart_send_str(a);
    16     __delay_cycles(5);
    17     uart_send_huiche();
    18 //    uart_send_ch((char)(ADC10MEM*25/1024));
    19 }
    中断处理数据

    多通道的也调通了,几点说明

    首先要在ADC10CTL0中开始MSC位

    然后 ADC10CTL1 = CONSEQ_3 + INCH_7;     CONSEQ选择转换方式此时为多通道多次,后面的INCH位最高通道位,因为我使用4-7四个通道所以最高INCH_7

    数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止。这里不做操作即可

    ADC10DTC1 = 0x04;设置转换次数,这里我只转换一遍即停止,因为四个通道所以为4,转换次数=通道数*每个通道转换次数

     ADC10AE0 |= BIT7+BIT6+BIT5+BIT4; 使能这四个通道

    ADC10SA =(unsigned int) adc_result;   //数据传送开始地址寄存器  设置DTC的开始地址  Data buffer start

    这里值得注意需要传入数组首地址。之前写的ADC10SA adc_result;编译不通过,加了前面的(unsigned int)就OK了,不明白这里。

    因为我的定义unsigned int adc_result[];

    总之这里改好后程序就OK了。

    下面给出代码

     1 void AD_MultiChannel_4_Config(unsigned int adc_result[])
     2 {
     3     ADC10CTL1 = CONSEQ_3 + INCH_7;     // 多通道多次转换, 最大转换通道为A1
     4 
     5 
     6       ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE + REF2_5V+ REFON + SREF_1; // ADC10ON, interrupt enabl
     7 
     8       //采样保持时间为16 x ADC10CLKs,ADC内核开,中断使能   MSC多次转换选择开
     9 
    10       //如果MSC置位,则第一次开始转换时需要触发源触发一次,以后的转换会自动进行  中断使能
    11 
    12       //使用DTC时,当一个块传送结束,产生中断
    13 
    14 
    15       //数据传送控制寄存器0 ADC10DTC0设置为默认模式:单传送块模式,单块传送完停止
    16 
    17       ADC10DTC1 = 0x04; //数据传送控制寄存器1 4 conversions  定义在每块的传送数目  一共采样4次所以单块传送4次
    18 
    19       //以后就停止了传送 因为是两通道的,所以是每个通道采样数据传送2次
    20 
    21 
    22       ADC10AE0 |= BIT7+BIT6+BIT5+BIT4;         // P1.0 P1.1 ADC option select 使能模拟输入脚A0 A1
    23 
    24          //不知道为什么,当P10 P11都悬空时,采样值不同,用电压表测得悬空电压不同,但是当都接上采样源的时候,
    25 
    26       //采样是相同的
    27 
    28 
    29       while (ADC10CTL1 & BUSY);
    30       ADC10SA =(unsigned int) adc_result;   //数据传送开始地址寄存器  设置DTC的开始地址  Data buffer start
    31 
    32               //设置数据开始传送的地址为数组adc_sample[]的首地址,因为寄存器ADC10SA和转换结果都是16位的,所以要把
    33 
    34               //地址强制转换为16位的int或unsigned int
    35 
    36               //应该也可以用指针直接访问DTC的存储区,还没试过
    37 
    38 
    39 
    40 }
    多通道设置

    启动AD代码与前面一样

     1 #pragma vector=ADC10_VECTOR
     2 __interrupt void ADC10_ISR (void)
     3 {
     4     int data ;
     5     float shuju,c;
     6     char a[4];
     7 /*    data = ADC10MEM;
     8     shuju =  ((double)data/1024)*2.5;
     9     c =shuju;
    10     a[0]= ((int)c%10+0x30);
    11     a[1]= 0x2e;
    12     a[2]=  ((int)(c*10)%10+0x30);
    13     a[3]=  ((int)(c*100)%10+0x30);
    14 
    15         uart_send_str(a);
    16     __delay_cycles(5);
    17     uart_send_huiche();
    18 */
    19     for(data=0;data<8;data++)
    20         {
    21 
    22 
    23             shuju =  ((double)adc_result[data]/1024)*2.5;
    24             c =shuju;
    25             a[0]= ((int)c%10+0x30);
    26             a[1]= 0x2e;
    27             a[2]=  ((int)(c*10)%10+0x30);
    28             a[3]=  ((int)(c*100)%10+0x30);
    29 
    30             uart_send_ch((char)data+0x30);
    31             uart_send_ch(' ');
    32             uart_send_str(a);
    33             __delay_cycles(5);
    34             uart_send_huiche();
    35             __delay_cycles(5);
    36 
    37         }
    中断数据处理

    这里 unsigned int adc_result[8];

    测试基本OK,还需要多做一些测试,目前手头资源有限

  • 相关阅读:
    docker学习网址
    ubantu安装docker
    ssh查看自己的公钥
    Ubuntu 桥接设置 (在ubantu 18.04.5 之前好用 ,,,,18.04.5 就不好用了)
    学习地址
    MANO官网
    centos7 的防火墙 开放端口
    centos7安装arp-sacn (./configure make makeinstall)
    yum源-postgresql
    行拆分,列合并
  • 原文地址:https://www.cnblogs.com/wwjdwy/p/3188799.html
Copyright © 2020-2023  润新知