7803|13

452

帖子

0

TA的资源

五彩晶圆(初级)

楼主
 

梦之旅同学LM3S811系列学习笔记之串口加内置AD温度计 [复制链接]

  Stellaris系列ARM集成有一个10位的ADC模块,支持8个输入通道,以及一个内部温度传感器。ADC模块含有一个可编程的序列发生器,可在无需控制器干涉的情况下对多个模拟输入源进行采样。每个采样序列均对完全可配置的输入源、触发事件、中断的产生和序列优先级提供灵活的编程。
Stellaris系列ARM的ADC模块提供系列特性:
􀁺 8个模拟输入通道
􀁺 单端和差分输入配置
􀁺 内部温度传感器
􀁺 高达1Msps(每秒采样一百万次)的采样率
􀁺 4个可编程的采样转换序列,入口长度1到8,每个序列均带有相应的转换结果FIFO
􀁺 灵活的触发控制:处理器(软件)、定时器、模拟比较器、PWM、GPIO
􀁺 硬件可对多达64个采样值进行平均计算(牺牲速度换取精度)
􀁺 转换器采用内部的3V参考电压
􀁺 分开的模拟电源和模拟地,跟数字电源和数字地分离

内部温度传感器提供了模拟温度读取操作和参考电压。输出终端SENSO的电压通过以下等式计算得到:
SENSO = 2.7 -(T+55)/ 75
这种关系如图1.4所示。

图1.4 ADC温度传感器温度-电压关系
下面我们来推导一个实用的ADC温度转换公式。假设温度电压SENSO对应的ADC采样值为N,2.7V对应N1,(T+55)/75对应N2。
已知:
N1 ×(3/1024)= 2.7
N2 ×(3/1024)= (T+55)/ 75
由此得到:
N = N1 - N2 = 2.7 /(3/1024)-((T+55)/75)/(3/1024)
解得:
T =(151040 - 225 × N)/ 1024
结论:ADC配置为温度传感器模式后,只要得到10位采样值N,就能推算出摄氏温度T。

#include<lm3sxxx.h>
#include<stdio.h>
#define uint unsigned int
#define uchar  unsigned char
#define ulong unsigned long
ulong Sysclk = 12000000UL;
tBoolean flag=false;

extern void jtagWait(void); // 防止JTAG失效
extern void clockInit(void); // 系统时钟初始化
extern void uartinit(void);
extern void put(const char *x);
extern void wellcome(void );
extern void SysTickInit(void);
extern void adcinit(void);
extern void tmpDisplay(ulong ulValue);
extern ulong adcSample(void);

int main(void)
{
ulong ulValue;
jtagWait();
clockInit();
uartinit();
adcinit();
SysTickInit();
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC | SYSCTL_PERIPH_GPIOB | SYSCTL_PERIPH_GPIOE | SYSCTL_PERIPH_GPIOD);          //  使能KEY所在的GPIO端口
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE,GPIO_PIN_0 | GPIO_PIN_1);     //  设置KEY所在管脚为输入
GPIOPinTypeGPIOOutput(GPIO_PORTE_BASE,GPIO_PIN_0 | GPIO_PIN_1);     //  设置KEY所在管脚为输入
GPIOPinTypeGPIOOutput(GPIO_PORTD_BASE,GPIO_PIN_0 | GPIO_PIN_1);     //  设置KEY所在管脚为输入
GPIOPinTypeGPIOOutput(GPIO_PORTC_BASE,GPIO_PIN_5);     //  设置KEY所在管脚为输入
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0 | GPIO_PIN_1,0x00);
GPIOPinWrite(GPIO_PORTD_BASE,GPIO_PIN_0 | GPIO_PIN_1,0x00);
GPIOPinWrite(GPIO_PORTE_BASE,GPIO_PIN_0 | GPIO_PIN_1,0x00);
wellcome();
while(1)
{
SysCtlSleep( ); // 睡眠,减少耗电以降低温度
ulValue = adcSample( ); // 唤醒后ADC温度采样
tmpDisplay(ulValue); // 通过UART显示芯片温度值
}
}


 

//  防止JTAG失效

void jtagWait(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOC);          //  使能KEY所在的GPIO端口
GPIOPinTypeGPIOInput(GPIO_PORTC_BASE,GPIO_PIN_4);     //  设置KEY所在管脚为输入
if (GPIOPinRead(GPIO_PORTC_BASE,GPIO_PIN_4) == 0x00)  //  若复位时按下KEY,则进入
    {
       while(1);                             //  死循环,以等待JTAG连接
    }
  SysCtlPeripheralDisable(SYSCTL_PERIPH_GPIOC);   //  禁止KEY所在的GPIO端口
}
void clockInit(void)
{
 SysCtlLDOSet(SYSCTL_LDO_2_75V);
 SysCtlClockSet(SYSCTL_XTAL_6MHZ | SYSCTL_SYSDIV_4 | SYSCTL_USE_PLL  | SYSCTL_OSC_MAIN ); // The crystal is 50MHz
 Sysclk=SysCtlClockGet();
}
void uartinit(void)
{
 SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
 SysCtlPeripheralEnable(SYSCTL_PERIPH_UART0);
 GPIOPinTypeUART(GPIO_PORTA_BASE,GPIO_PIN_0 | GPIO_PIN_1);
 UARTConfigSet(UART0_BASE,115200,UART_CONFIG_WLEN_8 | UART_CONFIG_STOP_ONE | UART_CONFIG_PAR_NONE);
 UARTEnable(UART0_BASE);
}
void put(const char *x)
{
 while(*x!='\0')
 {
  UARTCharPut(UART0_BASE,*(x++)); 
 }
}
void wellcome()
{
 put("*************************************\n");
 put("********      hello,eeworld!   ********\n");
 put("********    this is mengzhilv!    ********\n");
 put("********  Copyright @ 2011   ********\n");
 put("*************************************\n\n");
 SysCtlDelay(Sysclk);
}
void adcinit(void)
{
  SysCtlPeripheralEnable(SYSCTL_PERIPH_ADC);               //时钟使能
  SysCtlADCSpeedSet(SYSCTL_ADCSPEED_125KSPS); // 设置ADC采样速率
  ADCSequenceDisable(ADC_BASE, 3); // 配置前先禁止采样序列
  ADCSequenceConfigure(ADC_BASE,3,ADC_TRIGGER_PROCESSOR,0);        //ADC0 触发一直有效,优先级0
  ADCSequenceStepConfigure(ADC_BASE,3,0,ADC_CTL_TS|ADC_CTL_IE|ADC_CTL_END);   //ADC0 步进0,完成采样后,使能中断,通道0(ADC0)

  ADCIntEnable(ADC_BASE,3);                //三个中断使能
  IntEnable(INT_ADC3);
  IntMasterEnable();
                      //采样使能
  ADCSequenceEnable(ADC_BASE,3);
}
void SysTickInit(void)
{
SysTickPeriodSet(Sysclk); // 设置SysTick计数器的周期值
SysTickIntEnable( ); // 使能SysTick中断
IntMasterEnable( ); // 使能处理器中断
SysTickEnable( ); // 使能SysTick计数器
}
void tmpDisplay(ulong ulValue)
{
ulong ulTmp;
char cBuf[40];
ulTmp = 151040UL - 225 * ulValue;
sprintf(cBuf, "%ld.", ulTmp / 1024);
put(cBuf);
sprintf(cBuf, "%ld", (ulTmp % 1024) / 102);
put(cBuf);
put("℃\r\n");
}
// ADC采样
ulong adcSample(void)
{
ulong ulValue;
ADCProcessorTrigger(ADC_BASE, 3); // 处理器触发采样序列
while (!flag); // 等待采样结束
flag = false; // 清除ADC采样结束标志
ADCSequenceDataGet(ADC_BASE, 3, &ulValue); // 读取ADC转换结果
return(ulValue);
}
 void ADC3_ISR(void)
 {
   ulong value;
   value=ADCIntStatus(ADC_BASE,3,true);
    ADCIntClear(ADC_BASE,3);
  
    if(value!=0)
 {
  flag=true;
 }
 }
// SysTick计数器的中断服务函数
void SysTick_ISR(void)
{
// 仅用于唤醒CPU,而不需要做其他事情
}

最终测试效果


 

[ 本帖最后由 梦之旅 于 2011-5-23 22:46 编辑 ]

最新回复

我来顶一个!  详情 回复 发表于 2014-7-10 20:40
 
点赞 关注
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/

回复
举报

452

帖子

0

TA的资源

五彩晶圆(初级)

沙发
 
这个函数内含中断,时钟节拍,休眠等函数,昨天上的匆忙,所以没有详细介绍,后面我会更新
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 

回复

452

帖子

0

TA的资源

五彩晶圆(初级)

板凳
 
没人顶,自己顶起,大家写程序时候记得加jtagwait,本人亲自测试过,将jtag配置成io,下不了程序,按下user键后再按复位,就可以下载程序了,大家不妨试试。
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 
 

回复

4138

帖子

0

TA的资源

五彩晶圆(中级)

4
 
好帖子怎么没人顶,顶顶嘿嘿强烈支持
 
 
 

回复

255

帖子

0

TA的资源

纯净的硅(中级)

5
 
楼主如此辛苦为大家上帖,路过的一定要帮顶呀!在下先顶一个!
 
 
 

回复

452

帖子

0

TA的资源

五彩晶圆(初级)

6
 

回复 5楼 wwh19910609 的帖子

谢谢,呵呵
 
个人签名人生苦短,何必为声名所累,放开自己心态,去追求自己想要的梦想去吧!http://pytech-inc.taobao.com/
 
 

回复

196

帖子

0

TA的资源

一粒金砂(高级)

7
 
楼主辛苦 。 。。 。 。 。 。 。 。 。 。
 
 
 

回复

114

帖子

0

TA的资源

一粒金砂(中级)

8
 
谢谢分享!!
 
 
 

回复

546

帖子

0

TA的资源

一粒金砂(高级)

9
 
很详细啊!谢谢……
 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

10
 

回复 楼主 梦之旅 的帖子

谢谢楼主分享,学习下
 
 
 

回复

545

帖子

0

TA的资源

一粒金砂(高级)

11
 

很详细啊,不错

 
 
 

回复

26

帖子

0

TA的资源

一粒金砂(中级)

12
 

put(***/r/n)

换行啊 老兄

 
 
 

回复

11

帖子

0

TA的资源

一粒金砂(初级)

13
 

好东西

谢谢分享啊
 
 
 

回复

2

帖子

0

TA的资源

一粒金砂(初级)

14
 
我来顶一个!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/10 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表