完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
我选用的是REF2_5V(内部2.5V参考电压),读出转换寄存器 res =ADC12MEM0
结果为1800,怎么换算成摄氏温度呀?公式? 前几次测的结果为1780。 |
|
相关推荐
16个回答
|
|
找度娘啊
|
|
|
|
这个芯片数据手册有介绍吧
|
|
|
|
百度上,公式乱七八糟的,简直不知所云!只知道与设的参考电压有关!
|
|
|
|
额。。。就是没有耶,数据手册没提怎么用它,只知道有这个功能!
|
|
|
|
#include
#include "1602.h" #define CPU_F ((double) 8000000.0) //当前CPU主频 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) #define Num_of_Results 128 //采样次数 uint results[Num_of_Results]; //保存ADC转换结果的数组 uchar ple[]="0123456789"; uint results[]; uchar table[]; uint adcvalue=0; uint long temp; //测量通道电压值 void init_clk()//时钟初始化 { uchar i; BCSCTL1 &=~XT2OFF;//(置TX2=0)使TX2有效,默认是关闭的 do { IFG1 &= ~OFIFG;//清振荡器失效标志 for(i=0xff;i>0;i--); }while((IFG1 & OFIFG)!=0);//若振荡器失效标志有效 BCSCTL2|=SELM_2+SELS; //使MCLK=XT2=8M,SMCLK=8=8M } void display()//测量通道电压显示函数 { adcvalue=temp; table[0]=adcvalue/1000; table[1]=adcvalue%1000/100; table[2]=adcvalue%1000%100/10; table[3]=adcvalue%1000%100%10; write_com(0x80); write_data(ple[table[0]]); write_com(0x81); write_data(ple[table[1]]); write_com(0x82); write_data(ple[table[2]]); write_com(0x83); write_data(ple[table[3]]); } void main(void) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗  4DIR=0XFF; //8位数据口  4OUT=0x00;  3DIR=0XFF;  3OUT=0x00; init_clk();//时钟初始化 init(); //液晶初始化 ADC12CTL0 = SHT0_8 + REFON + ADC12ON;//使用内部参考电压,打开ADC12内核 ADC12CTL1 = SHP; //采样信号来源采样定时器,由采样输入信号的上升沿触发采样定时器 ADC12MCTL0 |=SREF_1+INCH_1;//选择参考电压为1.5V,转换通道为测量通道A2 ADC12IE = 0x01;//允许相应的中断标志位ADC12IFG.0在置位时发生中断请求服务 while(1) { display();//显示函数 ADC12CTL0 |= ENC + ADC12SC; //允许转换,启动转换 _EINT();//打开总中断 } } #pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void) { static uint index = 0; results[index++] = ADC12MEM0; // 移动转换结果 if(index == Num_of_Results) { uint i; index = 0; for(i = 0; i < Num_of_Results; i++)//连续采样64次 { temp += results; //64次采样的结果接在一起 } temp >>= 7; //除以64 } } |
|
|
|
回复【楼主位】古月:
--------------------------- 上面发错了,看下面这个。 #include #include "1602.h" #define CPU_F ((double) 8000000.0) //当前CPU主频 #define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0)) #define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0)) #define Num_of_Results 64 //采样次数 uint results[Num_of_Results]; //保存ADC转换结果的数组 uchar ple[]="0123456789"; uint results[]; uchar table[]; uint adcvalue=0; uint long temp; //温度测量通道电压值 uint long IntDegC;//温度值 void init_clk()//时钟初始化 { uchar i; BCSCTL1 &=~XT2OFF;//(置TX2=0)使TX2有效,默认是关闭的 do { IFG1 &= ~OFIFG;//清振荡器失效标志 for(i=0xff;i>0;i--); }while((IFG1 & OFIFG)!=0);//若振荡器失效标志有效 BCSCTL2|=SELM_2+SELS; //使MCLK=XT2=8M,SMCLK=8=8M } void display()//温度测量通道电压显示函数 { adcvalue=temp; table[0]=adcvalue/1000; table[1]=adcvalue%1000/100; table[2]=adcvalue%1000%100/10; table[3]=adcvalue%1000%100%10; write_com(0x80); write_data(ple[table[0]]); write_com(0x81); write_data(ple[table[1]]); write_com(0x82); write_data(ple[table[2]]); write_com(0x83); write_data(ple[table[3]]); } void disp_wendu()//温度显示函数 { table[0]=IntDegC/10; table[1]=IntDegC%10; write_com(0x80+0x40); write_data(ple[table[0]]); write_com(0x81+0x40); write_data(ple[table[1]]); } void main(void) { WDTCTL = WDTPW + WDTHOLD; //关闭看门狗  4DIR=0XFF; //8位数据口  4OUT=0x00;  3DIR=0XFF;  3OUT=0x00; init_clk();//时钟初始化 init(); //液晶初始化 ADC12CTL0 = SHT0_2 + REFON + ADC12ON;//使用内部参考电压,打开ADC12内核 ADC12CTL1 = SHP; //采样信号来源采样定时器,由采样输入信号的上升沿触发采样定时器 //ADC12MCTL0 = 0x1A; ADC12MCTL0 |=SREF_1+INCH_10;//选择参考电压为1.5V,转换通道为片内温度传感器的测量通道 ADC12IE |= 0x01;//允许相应的中断标志位ADC12IFG.0在置位时发生中断请求服务 ADC12IE |= BITA; while(1) { display();//显示函数 disp_wendu();//显示温度 ADC12CTL0 |= ENC + ADC12SC; //允许转换,启动转换 _EINT();//打开总中断 // oC = ((x/4096)*1500mV)-986mV)*1/3.55mV = x*423/4096 - 278 // IntDegC = (ADC12MEM0 - 2692)* 423/4096 IntDegC = (temp - 2692) * 423; IntDegC = IntDegC / 4096; } } #pragma vector=ADC_VECTOR __interrupt void ADC12ISR (void) { static uint index = 0; results[index++] = ADC12MEM0; // 移动转换结果 if(index == Num_of_Results) { uchar i; index = 0; for(i = 0; i < Num_of_Results; i++)//连续采样64次 { temp += results; //64次采样的结果接在一起 } temp >>= 6; //除以64 } } 不过用内部的温度传感器测量芯片温度,意义不大。 |
|
|
|
艾科兄,我测出来ADC12MEM0 为1800,差不多是你的temp吧!
那么: IntDegC = (temp - 2692) * 423; //岂不是负数了,情何以堪呢? IntDegC = IntDegC / 4096; //我用的是2.5V内部参考电压。 所以,怎么回事勒?我用烙铁烫430,ADC12MEM0的值会上升,是正常的。 |
|
|
|
上面的程序,选择的是1.5V参考电压,你改改就是了,改为1.5V或者改公式的值,就可以了。烙铁烫,别把芯片烫坏了!
|
|
|
|
呵呵,还用烙铁去感受。
|
|
|
|
好吧!睡一觉起来看下!谢谢各位师兄弟!
|
|
|
|
可以适当的烫一下,温度不要太高了就是~~~~
|
|
|
|
那请问2.5v基准电压的公式是什么
|
|
|
|
也不是上什么公式拉,直接把上面的代码里面的1500,改为2500
|
|
|
|
公式还是这个不变吗? oC = ((x/4096)*1500mV)-986mV)*1/3.55mV = x*423/4096 - 278 ,只要将1500改成2500
|
|
|
|
您好!请问有没有MSP控制sim900a发数据的源码,可否发一份给我,谢谢! 84772825@qq.com
|
|
|
|
这个应该参考电路图吧,计算分压比?
|
|
|
|
只有小组成员才能发言,加入小组>>
3029个成员聚集在这个小组
加入小组2917 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3579 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2337 浏览 1 评论
4795 浏览 1 评论
2571 浏览 1 评论
1317浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
3579浏览 2评论
2917浏览 1评论
1495浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-24 17:52 , Processed in 1.842004 second(s), Total 108, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号