zoukankan      html  css  js  c++  java
  • CC2540开发板学习笔记(六)——AD控制(自带温度计)

    一、实验目的

         将采集的内部温度传感器信息通过串口发送到上位机

    二、实验过程

    1、寄存器配置

    ADCCON1(0XB4)
    ADC控制寄存器1
    BIT7:EOC   ADC结束标志位
    0:AD转换进行中                     1:AD转换完成
      BIT6:ST     手动启动AD转换
    0:关闭                                  1:启动AD转换(需要BIT5:BIT4=11)
      BIT5:BIT4   AD转换启动方式
    00:外部触发
    01:全速转换,不需要触发
    10:T1通道比较触发
    11:手动触发
      BIT3:BIT2     16位随机数发生器控制位
    00:普通模式(13x打开)
    01:开启LFSR时钟一次(13x打开)
    10:保留位
    11:关
    ADCC0N2(0XB5)
    序列AD转换控制寄存器2
    BIT7:BIT6        SREF      选择AD转换参考电压
    00:内部参考电压(1.25V)
    01:外部参考电压AIN7输入
    10:模拟电源电压
    11:外部参考电压AIN6-AIN7差分输入
      BIT5:BIT4      设置AD转化分辨率
    00:64dec,7位有效      
    01:128dec,9位有效、
    10:256dec,10位有效
    11:512dec,12位有效
      BIT3:BIT2:BIT1:BIT0
    设置AD转换最末通道,如果置位时ADC正在运行,则在完成序列AD转换后立刻开始,否则置位后AD转换,转换完成后自动清0。
    0000:AIN0
    0001:AIN1
    0010:AIN2
    0011:AIN3
    0100:AIN4
    0101:AIN5
    0110:AIN6
    0111:AIN7
    1000:AIN0-AIN1差分
    1001:AIN2-AIN3差分
    1010:AIN4-AIN5差分
    1011:AIN6-AIN7差分
    1100:GND
    1101:保留
    1110:温度传感器
    1111:1/3模拟电源电压
    ADCCON3(0XB5)
    单通道AD转换控制寄存器3
    BIT7:BIT6   SREF   选择单通道AD选择参考电压
    00:内部参考电压(1.25V)
    01:外部参考电压AIN7输入
    10:模拟电源电压
    11:外部参考电压AIN6-AIN7差分输入
      BIT5:BIT4       设置单通道AD转换分辨率
    00:64dec,7位有效      
    01:128dec,9位有效、
    10:256dec,10位有效
    11:512dec,12位有效
      BIT3:BIT2:BIT1:BIT0
    设置AD转换最末通道,如果置位时ADC正在运行,则在完成序列AD转换后立刻开始,否则置位后AD转换,转换完成后自动清0。
    0000:AIN0
    0001:AIN1
    0010:AIN2
    0011:AIN3
    0100:AIN4
    0101:AIN5
    0110:AIN6
    0111:AIN7
    1000:AIN0-AIN1差分
    1001:AIN2-AIN3差分
    1010:AIN4-AIN5差分
    1011:AIN6-AIN7差分
    1100:GND
    1101:保留
    1110:温度传器
    1111:1/3模拟电源电压
    TR0(0x624B) BIT0:置1表示将温度传感器与ADC连接起来
    ATEST(0x61BD) BIT0:置1表示将温度传感器启用

    2、源码

    adc.h

    #ifndef ADC_H_
    #define ADC_H_
    
    #include <ioCC2540.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    void AdcInit(void);//内部温度传感器
    
    uint GetAdcValue(void);//得到单次转换的AD值
    
    uint TempDeal(uint TempAdValue);//将温度传感器的Ad值转换成温度值,扩大100倍
    
    void ChanceValueToString(uint Data ,uchar *Buff);//将数值转换为字符串
    
    
    
    
    
    #endif
    #include "adc.h"
    
    
    void AdcInit(void)//内部温度传感器
    {
      ADCCON1 = 0x33;//软件启动转换
      ADCCON3 = 0x3e;//内部参考电压,12位分辨率,选择温度传感器输入
      TR0 = 0x01;
      ATEST = 0x01;
    //  ADCCON1 |= 0x40;//软件启动转换
    }
    
    uint GetAdcValue(void)
    {
      uint AdValue=0;
      
      ADCCON1 |= 0x40;
      while(!(ADCCON1 & 0x80));
      AdValue = ADCL >>4;
      AdValue |= ADCH <<4;
      
      return AdValue; 
    }
    
    uint TempDeal(uint TempAdValue)//将温度传感器的Ad值转换成温度值,扩大100倍
    {
      float Tempruture;
      Tempruture = (TempAdValue-1367.5)/4.5+2.5; 
      TempAdValue = (uint)(Tempruture*100);
      return TempAdValue;
    }
    
    void ChanceValueToString(uint Data ,uchar *Buff)//将数值转换为字符串
    {
      Buff[0] = (Data/10000)+0x30; 
      Buff[1] = ((Data/1000)%10)+0x30; 
      Buff[2] = ((Data/100)%10)+0x30; 
      Buff[3] = '.'; 
      Buff[4] = ((Data/10)%10)+0x30; 
      Buff[5] = (Data%10)+0x30; 
      Buff[6] = '
    '; 
      Buff[7] = '';
    }

    sysclock

    #ifndef SYSCLK_H_
    #define SYSCLK_H_
    
    #include<ioCC2540.h>
    
    void SysClkSet_32M(void);//设置系统时钟为32MHz
    
    #endif
    #include "sysclk.h"
    
    
    void SysClkSet_32M(void)//设置系统时钟为32MHz
    {
      CLKCONCMD &= ~0x40;
      while(CLKCONSTA & 0x40);    
      CLKCONCMD &= ~0x47;  
    }

    usart0

    #ifndef USART0_H_
    #define USART0_H_
    
    #include<ioCC2540.h>
    
    #define uint unsigned int
    #define uchar unsigned char
    
    
    void UartInit(void);//115200
    
    void Uart0_SendByte(uchar Byte);//发送一个数据
    
    void Uart0_SendString(uchar *Buff);//发送一个字符串
    
    
    
    #endif
    #include"usart0.h"
    
    void UartInit(void)
    {  
      P2DIR &= ~0xc0;//备用位置1
      PERCFG &= ~0x01;//设置UART0高优先级 
      P0SEL |= 0x3c;//2 3 4 5作为外设 
      U0CSR = 0xc0;
      U0GCR = 11;  //设置波特率,可参考CC2530中文文档中的相应表格
      U0BAUD = 216; 
      EA=1;
      URX0IE=1;//接收中断  URX0IF--接收中断标志位   UTX0IF--发送完成标志位 
    }
    
    void Uart0_SendByte(uchar Byte)//发送一个字符
    {
      U0DBUF=Byte; 
      while(!UTX0IF);
      UTX0IF=0;
    }
    
    void Uart0_SendString(uchar *Buff)//发送一串字符
    {
      uchar *p;
      p=Buff;
      while(*p != 0)
      {
        Uart0_SendByte(*p);
        p++;
      }
    }
    
    
    #pragma vector = URX0_VECTOR   //中断向量
    __interrupt void Uart0RxInt(void)
    {
      URX0IF=0; 
      Uart0_SendByte(U0DBUF);
    }

    mian

    #include<ioCC2540.h>
    #include"sysclk.h"
    #include"usart0.h"
    #include"adc.h"
    
    #define uint unsigned int
    #define uchar unsigned char
    void Delay(uint n);
    uchar TempDis[8];
    
    void main()
    {
      SysClkSet_32M();//设置系统时钟为32MHz
      UartInit();     //115200
      
      while(1)
      {
        AdcInit();      //初始化ADC
        ChanceValueToString(TempDeal(GetAdcValue()),TempDis);//获取当前温度值并将其装换成字符串
        Uart0_SendString(TempDis);//打印温度值
        Delay(1000);
      }
    }
    
    
    
    void Delay(uint n)
    {
      uint i,j;
      for(i=n;i>0;i--)
        for(j=5000;j>0;j--);
    }

    image

  • 相关阅读:
    一句话概括下spring框架及spring cloud框架主要组件
    服务注册与发现
    微服务API Gateway
    微服务分布式事务的一些思考
    微服务框架的存储架构
    轻量级微服务框架的通信架构
    基于Docker的负载均衡和服务发现
    测试一下标签
    让360安全浏览器默认使用谷歌内核
    schema中字段类型的定义
  • 原文地址:https://www.cnblogs.com/BlueMountain-HaggenDazs/p/4298381.html
Copyright © 2011-2022 走看看