微波EDA网,见证研发工程师的成长!
首页 > 硬件设计 > 硬件工程师文库 > 由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)

由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)

时间:07-18 来源:本站整理 点击:

传感器温度采集

  CC254x内部有一个温度传感器,我们这节使用这个传感器来采集芯片的温度,此传感器精度不高。不适合用于实际的工程中,这里只为演示AD采样。要使用内部的温度采集我们需要使用AD采样,所以我们需要先来了解CC254x的AD功能。在后续课程有对ADC的详细说明。

  ADC结构图如下所示:

  

  ADC控制寄存器1如下图所示:

  

  我们使用手动触发的方式进行AD采样,所以STSEL = 11B,最低两位始终为1,最终ADCCON1=0x33。

  ADC控制寄存器3如图所示:

  

  ADC参考电压使用内部电压,采用12位精度采集。采集温度通道。所以ADCCON3= 0x3E。这里注意一点,ADCCON2和ADCCON3的配置是一样的,我们这里用ADCCON3来配置。

  uint16 ADC_Read (uint8 channel)

  {

  int16 reading = 0;

  uint8 adcChannel = 0x01《《channel;

  int16 Result = 0;

  if (channel 《= 7) // 通道0-7需要通过P0.0-P0.7输入

  {

  ADCCFG |= adcChannel;

  }

  uint8 i=0;

  do{

  ADCCON3 = channel | 0x20; // 12位精度,启动转换

  while (!(ADCCON1 & 0x80)); // 等待转换完成

  // 读取采样结果

  reading = (int16)(ADCL);

  reading |= (int16)(ADCH 《《 8);

  reading 》》= 4; // 丢弃低位

  Result += reading; // 累加

  }while(i++ 《 10); // 连续采样10次

  if (channel 《= 7)

  {

  ADCCFG &= (adcChannel ^ 0xFF);

  }

  return (Result/10);

  }

  在读取温度值前,我们还需要使能温度传感器。

  int main(void)

  {

  float temp=0;

  char LCDBuf[21] = {0};

  SysStartXOSC(); // 启动外部晶振

  LCD12864_Init(); // LCD初始化

  // 打开温度传感器

  TR0 = 0x01;

  ATEST = 0x01;

  while(1)

  {

  temp = (ADC_Read(TEMP_ADC_CHANNEL) - 1340) /10.0;

  sprintf(LCDBuf, " temp : %0.1f", temp); //

  LCD12864_DisStr(3, LCDBuf);

  SoftWaitUs(100000);

  }

  return 0;

  }

  采集的温度显示在LCD上,可以看到温度在跳动,这是由于AD的误差太大导致的,这里只做一个简单的实验,如果需要工程应用,建议外接温度传感器。把手放在芯片上可以看到温度在上升。温度采集结果如下图所示:

  第九节 五向按键

  五向按键,也就是我们平常所见的摇杆内部构造,五向按键有上下左右和中间五个按键值,MT254xboard上的五向按键检测电路由馒头科技自主设计,而不是TI的设计,采用一个外部中断和一个AD检测口来完成按键的检测。

  

  由原理图可知当我们按下不同的键值时在JOY_CHK将会产生一个上升沿,并且在JOY_AD口有不同的电压。我们只需要在JOY_CHK的外部中断中读取JOY_AD的电压即可识别不同的按键。

  外部中断和AD采用在前面已经讲过了,这里只需要拿来用就可以了。JOY_CHK连接在P0.7脚,JOY_AD连接在P0.6脚。我们将按键值显示在LCD上。

  int main(void)

  {

  uint8 KeyValue = 0;

  SysStartXOSC();

  LCD12864_Init();

  LCD12864_DisStr(1, " JoySTIck Test");

  P0INP |= 0X40; // P0.6 三态

  P0SEL &= ~0X80; // 设置为IO功能

  P0DIR &= ~0X80; // 设置为输入功能

  P0IEN |= 0X80; // P0.7 设置为中断方式

  PICTL &= ~0X80; // 上升沿触发

  IEN1 |= 0X20; // 允许P0口中断

  P0IFG = 0x00; // 清除中断标志位

  EA = 1; // 开总中断

  while(1)

  {

  if(KeyStat) // 按键按下

  {

  KeyValue = GetKeyValue();

  switch ( KeyValue )

  {

  case KEY_UP :

  sprintf(LCDBuf, "\tUP");

  break;

  case KEY_DOWN :

  sprintf(LCDBuf, "\tDown");

  break;

  case KEY_LEFT :

  sprintf(LCDBuf, "\tLeft");

  break;

  case KEY_CENTER :

  sprintf(LCDBuf, "\tCenter");

  break;

  case KEY_RIGHT :

  sprintf(LCDBuf, "\tRight");

  break;

  default:

  break;

  }

  KeyStat =0;

  LCD12864_DisStr(3, LCDBuf);

  }

  }

  return 0;

  }

  

  按键的检测通过电压来区分。

  uint8 GetKeyValue(void)

  {

  uint16 adc;

  uint8 ksave0 = 0;

  adc = ADC_Read (JOY_AD_CHANNEL);

  if ((adc 》= 800) && (adc 《= 1100))

  {

  ksave0 = KEY_RIGHT;

  }

  else if ((adc 》= 1200) && (adc 《= 2000))

  {

  ksave0 = KEY_CENTER;

  }

else if ((adc 》= 2050) && (adc 《=

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top