为什么使能adc温度传感器go 连接两个io口哪个io口

提升 GSR 测量、人体存在检测以及热监控应用性能的 AS6200 数字温度传感器_物联网在线网站已改版,请使用新地址访问:
AN_O0324 利用ADC实现温度采集
SPMC65系列单片机,使用MCU的 ADC , 传感器采用 NTC SCM 开发 247万源代码下载-
&文件名称: AN_O0324& & [
& & & & &&]
&&所属分类:
&&开发工具: Asm
&&文件大小: 350 KB
&&上传时间:
&&下载次数: 50
&&提 供 者:
&详细说明:利用ADC实现温度采集
SPMC65系列单片机,使用MCU的 ADC采集温度,温度传感器采用 NTC 热敏电阻,将热敏电阻的阻值转化为相应的电压值,MCU 通过采集模拟电压计算出
相应的温度值-Temperature measurement using ADC to achieve SPMC65 MCU, MCU&#39 s ADC acquisition using the temperature, the temperature sensor NTC thermistor, the thermistor resistance will translate into a corresponding voltage value, MCU analog voltage is calculated by collecting the corresponding temperature
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&AN_O0324\ADConvert\ADConvert.cmd&&........\.........\ADConvert.env&&........\.........\ADConvert.opt&&........\.........\ADConvert.RC&&........\.........\ADConvert.set&&........\.........\ADConvert.spj&&........\.........\Convert.asm&&........\.........\Debug\ADConvert.bin&&........\.........\.....\ADConvert.map&&........\.........\.....\ADConvert.sbm&&........\.........\.....\ADConvert.sym&&........\.........\.....\main.lst&&........\.........\.....\main.obj&&........\.........\Init.asm&&........\.........\LED.asm&&........\.........\main.asm&&........\.........\Makefile&&........\.........\Prog.lik&&........\.........\SPMC65P2404A.inc&&........\AN_O0324_cn_V1.0.pdf&&........\.DConvert\Debug&&........\ADConvert&&AN_O0324
&[]:很好,推荐下载&[]:很好,推荐下载
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站247万海量源码库中尽情搜索:
&[] - 采用廉价的NTC热敏电阻设计高精度温度计的方案,
根据NTC热敏电阻的温度特性,采用了较具新意程序算法;摆脱了传统的查表显示温度的方法,
特点:程序中无须查表,打破了常规的查表显示温度的方法。
&[] - avr单片机开发板原理图。具有232,485等通信接口,isp,jtag,i2c等总线,热敏电阻,8位LED显示等常用功能。
&[] - MSP430采集温度,采用NTC热敏电阻,程序调试通过
&[] - 利用热敏电阻进行温度测量的经典程序,充分发挥单片机定时器性能
&[] - NTC热敏电阻测温,编译环境,AVR-G
&[] - 开发的一个温控仪完整代码,使用Keil开发环境,使用热敏电阻测温度,晶闸管输出,供参考。
&[] - 这是一个介绍NTC温度传感器的使用说明,它深入的介绍了它的工作原理,对从事温度方面的有很大的帮助
&[] - 实现单片机ad采样,然后经spi接口传输,程序已经调通,适用于51架构的
&[] - NTC热敏电阻测温 可实现1摄氏度以内误差
&[] - NTC热敏电阻是电阻型传感器,随着温度变高阻值下降,利用串联分压,实现AD转换,实时显示温度值TI CC2540(UART_ADC)内部温度检测串口传送【cc2540吧】_百度贴吧
&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&签到排名:今日本吧第个签到,本吧因你更精彩,明天继续来努力!
本吧签到人数:0可签7级以上的吧50个
本月漏签0次!成为超级会员,赠送8张补签卡连续签到:天&&累计签到:天超级会员单次开通12个月以上,赠送连续签到卡3张
关注:49贴子:
TI CC2540(UART_ADC)内部温度检测串口传送
#include &stdio.h&#include &string.h&#include &UartTimer.h&#define HAL_ADC_REF_1V25
0x00#define ADC_12_BIT
0x30#define ADC_EMP_SENS
0x0E#define ADC_TO_CELSIUS(ADC_VALUE)
((ADC_VALUE&&4)-334)
//温度校正void InitSensor(void){
DISABLE_ALL_INTERRUPTS();
//关闭所有中断
InitClock();
//设置系统主时钟为 32M
//设置为1来连接温度传感器到SOC_ADC
ATEST=0x01;
//使能温度传感}
float GetTemperaturerature(void){
unsigned char tmpADCCON3 = ADCCON3;
ADCIF = 0;
//选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
= (HAL_ADC_REF_1V25 | ADC_12_BIT | ADC_EMP_SENS);
while(!ADCIF);
//等待 AD 转换完成
ADCL && 2;
//ADCL 寄存器低 2 位无效
value |= (((unsigned int)ADCH) && 6);
ADCCON3 = tmpADCCON3;
return ADC_TO_CELSIUS(value);
}void main(void) {
float AvgT
char strTemp[6];
InitUART();
//初始化串口
InitSensor();
//初始化 ADC
AvgTemp = 0;
for (i=0; i&64; i++)
AvgTemp += GetTemperature();
AvgTemp = AvgTemp/64;
//每次累加后除 64
memset(strTemp, 0, 6);
sprintf(strTemp,&%.02f&, AvgTemp);//将浮点数转成字符串
UartSendString(strTemp, 5);
//通过串口发给电脑显示芯片温度
DelayMS(1000);
海运集装箱 锦江航运
#include &stdio.h&#include &string.h&#include &UartTimer.h&#define HAL_ADC_REF_1V25
0x00#define ADC_12_BIT
0x30#define ADC_EMP_SENS
0x0E#define ADC_TO_CELSIUS(ADC_VALUE)
((ADC_VALUE&&4)-334)
//温度校正void InitSensor(void){
DISABLE_ALL_INTERRUPTS();
//关闭所有中断
InitClock();
//设置系统主时钟为 32M
//设置为1来连接温度传感器到SOC_ADC
ATEST=0x01;
//使能温度传感}
float GetTemperaturerature(void){
unsigned char tmpADCCON3 = ADCCON3;
ADCIF = 0;
//选择1.25V为参考电压;12位分辨率;对片内温度传感器采样
= (HAL_ADC_REF_1V25 | ADC_12_BIT | ADC_EMP_SENS);
while(!ADCIF);
//等待 AD 转换完成
ADCL && 2;
//ADCL 寄存器低 2 位无效
value |= (((unsigned int)ADCH) && 6);
ADCCON3 = tmpADCCON3;
return ADC_TO_CELSIUS(value);
}void main(void) {
float AvgT
char strTemp[6];
InitUART();
//初始化串口
InitSensor();
//初始化 ADC
AvgTemp = 0;
for (i=0; i&64; i++)
AvgTemp += GetTemperature();
AvgTemp = AvgTemp/64;
//每次累加后除 64
memset(strTemp, 0, 6);
sprintf(strTemp,&%.02f&, AvgTemp);//将浮点数转成字符串
UartSendString(strTemp, 5);
//通过串口发给电脑显示芯片温度
DelayMS(1000);
/***************************************************************************** 名
称: InitUart()* 功
能: 串口初始化函数* 入口参数: 无* 出口参数: 无****************************************************************************/void InitUART(void){
PERCFG = 0x00;
//位置1 P0口
P0SEL = 0x3C;
//P0用作串口
P2DIR &= ~0xC0;
//P0优先作为UART0
U0CSR |= 0x80;
//串口设置为UART方式
U0GCR |= 11;
U0BAUD |= 216;
//波特率设为115200
UTX0IF = 1;
//UART0 TX中断标志初始置位1
U0CSR |= 0x40;
//允许接收
IEN0 |= 0x84;
//开总中断,接收中断}/***************************************************************************** 名
称: UartSendString()* 功
能: 串口发送函数* 入口参数: Data:发送缓冲区
len:发送长度* 出口参数: 无****************************************************************************/void UartSendString(char *Data, int len){
for(i=0; i& i++)
U0DBUF = *Data++;
while(UTX0IF == 0);
UTX0IF = 0;
U0DBUF = 0x0A;
//输出换行
while(UTX0IF == 0);
UTX0IF = 0;}/***************************************************************************** 名
称: DelayMS()* 功
能: 以毫秒为单位延时 16M时大约为530,32M需要调整,系统时钟不修改默认为16M* 入口参数: msec 延时参数,值越大,延时越久* 出口参数: 无****************************************************************************/void DelayMS(uint msec){
for (i=0; i& i++)
for (j=0; j&1060; j++);}
贴吧热议榜
使用签名档&&
保存至快速回贴请教ADC内部温度传感器的例程问题 - MSP430(TM)16 位超低功耗 MCU - 德州仪器在线技术支持社区
请教ADC内部温度传感器的例程问题
发表于3年前
<input type="hidden" id="hGroupID" value="37"
&msp430x14x.h&
#define ADCDeltaOn
// ~2 Deg C delta
static unsigned int FirstADCV
// holds 1st ADC result
void main(void)
WDTCTL = WDTPW + WDTHOLD;
// Stop watchdog
P1OUT = 0x00;
// Clear P1
P1DIR = 0x01;
// P1.0 as output
ADC12CTL1 = SHS_1 + SHP + CONSEQ_2;
// TA trig., rpt conv.
ADC12MCTL0 = SREF_1 + INCH_10;
// Channel A10, Vref+
ADC12IE = 0x01;
// Enable ADC12IFG.0
ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC; // Config ADC12
TACCTL1 = OUTMOD_4;
// Toggle on EQU1 (TAR = 0)
TACTL = TASSEL_2 + MC_2;
// SMCLK, cont-mode
while (!(0x01 & ADC12IFG));
// First conversion?
FirstADCVal = ADC12MEM0;
// Read out 1st ADC value
_BIS_SR(LPM0_bits + GIE);
// Enter LPM0 w/ interrupt
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
if (ADC12MEM0 &= FirstADCVal + ADCDeltaOn)
P1OUT &= ~0x01;
// LED off
else P1OUT |= 0x01;
&p>请问&ADC12MEM0 &= FirstADCVal + ADCDeltaOn&这句是什么意思?为什么要加上12?&/p>
&p>还有SHS_1选择定时器A触发采样,而&TACCTL1 = OUTMOD_4; &选择toggle又是什么意思?&/p>
&p>这个程序时测量芯片内部的温度吗?&/p>&div style=&clear:&>&/div>" />
请教ADC内部温度传感器的例程问题
此问题已被解答
All Replies
&msp430x14x.h&
#define ADCDeltaOn
// ~2 Deg C delta
static unsigned int FirstADCV
// holds 1st ADC result
void main(void)
WDTCTL = WDTPW + WDTHOLD;
// Stop watchdog
P1OUT = 0x00;
// Clear P1
P1DIR = 0x01;
// P1.0 as output
ADC12CTL1 = SHS_1 + SHP + CONSEQ_2;
// TA trig., rpt conv.
ADC12MCTL0 = SREF_1 + INCH_10;
// Channel A10, Vref+
ADC12IE = 0x01;
// Enable ADC12IFG.0
ADC12CTL0 = SHT0_8 + REF2_5V + REFON + ADC12ON + ENC; // Config ADC12
TACCTL1 = OUTMOD_4;
// Toggle on EQU1 (TAR = 0)
TACTL = TASSEL_2 + MC_2;
// SMCLK, cont-mode
while (!(0x01 & ADC12IFG));
// First conversion?
FirstADCVal = ADC12MEM0;
// Read out 1st ADC value
_BIS_SR(LPM0_bits + GIE);
// Enter LPM0 w/ interrupt
#pragma vector=ADC_VECTOR
__interrupt void ADC12ISR (void)
if (ADC12MEM0 &= FirstADCVal + ADCDeltaOn)
P1OUT &= ~0x01;
// LED off
else P1OUT |= 0x01;
请问&ADC12MEM0 &= FirstADCVal + ADCDeltaOn&这句是什么意思?为什么要加上12?
还有SHS_1选择定时器A触发采样,而&TACCTL1 = OUTMOD_4; &选择toggle又是什么意思?
这个程序时测量芯片内部的温度吗?
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
榜眼18653分
Tiggle是触发ADC采样的源头,用来定采样率的,现在是采样定时器控制ADC采样频率用。
Michael Qian
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
进士3810分
楼主,你好
& &你这段代码是使用ADC测量芯片温度,因为ADC的通道10连接到了内部温度传感器;
&&&ADC12MEM0 &= FirstADCVal + ADCDeltaOn&以及接下来的中断中程序的意思是,当测量到的温度转换值大于初始值(FirstADCVal)12的时候就点亮LED,表示芯片温度高于初始值12. 芯片的初始温度值FirstADCVal在reset之后被测量出来。
&&toggle表示当定时器计时到指定间隔时间的时候将定时器输出口翻转。因为使用了定时器触发,所以定时器输出内部被连接到了ADC用来触发采样。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
step by step
楼主,你好
& &你这段代码是使用ADC??量芯片温度,因为ADC的通道10连接到了内部温度传感器;
&&&ADC12MEM0 &= FirstADCVal + ADCDeltaOn&以及接下来的中断中程序的意思是,当测量到的温度转换值大于初始值(FirstADCVal)12的时候就点亮LED,表示芯片温度高于初始值12. 芯片的初始温度值FirstADCVal在reset之后被测量出来。
&&toggle表示当定时器计时到指定间隔时间的时候将定时器输出口翻转。因为使用了定时器触发,所以定时器输出内部被连接到了ADC用来触发采样。
&(FirstADCVal)12&??不懂,
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
进士3810分
这么说吧,芯片reset的时候会调用ADC采集温度,存放到FirstADCVal作为初始温度值,然后不断检测温度,当检测到的温度大于初始温度12的时候(这个12是ADC的采样值)就点亮一个LED报警。
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
在吗还?这个12不是初始温度啊。?初始温度是FirstADCVal啊.还是不明白,那个#define ADCDeltaOn&&&&&& 12&&&&&&&&&&&&&&& // ~2 Deg C delta到底是干嘛的???
You have posted to a forum that requires a moderator to approve posts before they are publicly available.关于STM32 ADC内部温度传感 器的问题 - ARM技术论坛 -
中国电子技术论坛 -
最好最受欢迎电子论坛!
后使用快捷导航没有帐号?
关于STM32 ADC内部温度传感 器的问题
23:44:02  
小生最近想调试一下STM32的内部温度传感器,用于对比内外温度相差多少 。可是开启ADC后,发现读到的数据不对,想请问下是否有人遇到过类似问题,望指点一二。下面为ADC的程序。
void&&Adc_init(void)
& & //先初始化IO口& && && && &
& & RCC-&APB2ENR|=1&&9;& & //ADC1时钟使能& && &
& & RCC-&APB2RSTR|=1&&9;& &//ADC1复位
& & RCC-&APB2RSTR&=~(1&&9);//复位结束& && &&&
& & RCC-&CFGR&=~(3&&14);& &//分频因子清零& &
& & RCC-&CFGR|=2&&14;& && && &&&
& & ADC1-&CR1&=0XF0FFFF;& &//工作模式清零
& & ADC1-&CR1|=0&&16;& && &//独立工作模式&&
& & ADC1-&CR1&=~(1&&8);& & //非扫描模式& && &
& & ADC1-&CR2&=~(1&&1);& & //单次转换模式
& & ADC1-&CR2&=~(7&&17);& && &
& & ADC1-&CR2|=7&&17;& && & //软件控制转换&&
& & ADC1-&CR2|=1&&20;& && &//使用用外部触发(SWSTART)!!!& & 必须使用一个事件来触发
& & ADC1-&CR2&=~(1&&11);& &//右对齐& &&&
& & ADC1-&SQR1&=~(0XF&&20);
& & ADC1-&SQR1&=0&&20;& &&&//1个转换在规则序列中 也就是只转换规则序列1& && && && && &
& & ADC1-&SMPR1&=~(7&&18);&&//清除通道16原来的设置& &&&
& & ADC1-&SMPR1|=7&&18;& &&&//通道16&&239.5周期,提高采样时间可以提高精确度& &&&
& & ADC1-&SMPR2&=0XFFFFFF0F;//通道1采样时间清空& && && &&&
& & ADC1-&SMPR2|=7&&3;& && &//通道1&&239.5周期,提高采样时间可以提高精确度& &&&
& & ADC1-&CR2|=1&&23;& && &//使能温度传感器
& & ADC1-&CR2|=1&&0;& && &&&//开启AD转换器& &&&
& & ADC1-&CR2|=1&&3;& && &&&//使能复位校准&&
& & while(ADC1-&CR2&1&&3);&&//等待校准结束& && && && &&&
& & //该位由软件设置并由硬件清除。在校准寄存器被初始化后该位将被清除。& && && &
& & ADC1-&CR2|=1&&2;& && &&&//开启AD校准& && &
& & while(ADC1-&CR2&1&&2);&&//等待校准结束
//获得ADC值
//ch:通道值 0~3& && &&&//ADC规则序列寄存器 3(ADC_SQR3)
u16 Get_Adc(u8 ch)& &
& & //设置转换序列& && && && && &
& & ADC1-&SQR3&=0xfffffff0;//规则序列1 通道ch
& & ADC1-&SQR3|=& && && && && && && &
& & ADC1-&CR2|=1&&22;& && & //启动规则转换通
& & while(!(ADC1-&SR&1&&1));//等待转换结束
& & re=& & ADC1-&DR;
& & ADC1-&SR|=~(1&&1);& && &
& && && &&&//返回adc值& &
u16 Get_Temperature(void)
& & u16 temp=0;
& & for(t=0;t&10;t++)
& && &&&temp+=Get_Adc(16);
& && &&&delay_ms(5);
& & return temp=temp/10;
void show_ADC_TEMP(void)
& & u8 g,bai,shi,ge,c,d,e;
& & float a,b;
& & tem=Get_Temperature();
& && &delay_ms(50);
& && &tem&=0X00& & //不加这一句,只显示0,加之后,个位及小数位才有变化,可是数据也不对
& &a=(float)tem*(3.3/4096);
& &b=(1.43-b)/0.0043+25;
& &b=b*10000;
& &&&bai=(u16)b/1000000;
& &shi=& &&&(u16)b%000;
& &ge=& & (u16)b%00;
& &g= (u16)b%;
& &c=(u16)b%;
& &d=(u16)b%100/10;
& &e=(u16)b%10;
& && & lcd_wcmd(0x80);//这些为LCD显示部分
& & lcd_wdat(bai+0x30);
& &&&lcd_wdat(shi+0x30);
& &&&lcd_wdat(ge+0x30);
& &&&lcd_wdat('.');
& &&&lcd_wdat(g+0x30);
& &&&lcd_wdat(c+0x30);
& &&&lcd_wdat(d+0x30);
& &&&lcd_wdat(e+0x30);
23:01:23  
Get_Adc 倒数第二句
ADC1-&SR|=~(1&&1);
ADC1-&SR &= ~(1&&1);
你的程序主要是数值精度丢失的问题:
Get_Temperature 返回的ADC读数最大为4095,最小为1
a=(float)tem*(3.3/4096);
这句里面的常数(3.3/4096)是个很小的数值,用浮点数表示这个常数表示这么小的数值,本身就没多少精度可言;运算后a的数值在1/之间,对于浮点数来说,已经丢失了很多数值精度;
建议你不要用浮点数,直接用读取的温度值转成u32或u64类型×1000000来计算,这样肯定不会丢失精度;
17:45:25  
PCB在线计价下单
板子大小:
板子数量:
PCB 在线计价
谢谢,我会参考此方法再验证一下,看看能否得到正确的结果,那再问一下:
&&tem&=0X00& & //不加这一句,只显示0,加之后,个位及小数位才有变化,可是数据也不对
要加上这一句的原因也是精度问题导致的吗?
助理工程师
08:07:06  
【电子产品研发交流】:() 欢迎来群里共同探讨!
10:49:23  
楼主这个只是读取ADC-&DR寄存器的值,并没有将这个数值与温度关联起来,所以,你得到的数据并不是温度,所以你的数据显示个十百千是没有什么意义的 ,将DR寄存器的值和温度关联还需要一些步骤,具体的步骤手册上有,在A.7.16 Temperature computation code example。
Powered by
供应链服务
商务及广告合作
Jeffery Guo
关注我们的微信
供应链服务 PCB/IC/PCBA
版权所有 (C) 深圳华强聚丰电子科技有限公司}

我要回帖

更多关于 socket.io 断开连接 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信