首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >内部Temp Arduino

内部Temp Arduino
EN

Stack Overflow用户
提问于 2020-01-05 02:48:07
回答 1查看 57关注 0票数 0

摘要:内部温度无法连接到正确的通道。

希望从通道中获得正确的值。

代码语言:javascript
复制
#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include <avr/interrupt.h>

uint8_t ReADC()//read value ad
{
  ADMUX = (1 << MUX3) | (1 << REFS0) | (1 << REFS1) | (1 << ADLAR);
  //single conversion 
  ADCSRA |= (1 << ADEN) | (1<<ADSC) | (1 << ADPS2);

  ISR(TIMER0_COMPA_vect){
    ADC();
  }
  void SPI_MASTER(){
    DDRB = (1 << PB0) | (1 << PB3) | (1 << PB5);
    SPCR = (1 << CPOL) | (1 << MSTR) | (1 << SPR0) | (1 << SPI2X) | (1 << SPE); 
  }
}
EN

回答 1

Stack Overflow用户

发布于 2020-01-05 23:43:02

我同意您的意见-您应该阅读DS,ADC转换结果和温度测量部分。

但是在测量过程中有一个错误(ADC使用问题),使您无法读取正确的ADC结果以进行温度计算。

请参见:

代码语言:javascript
复制
uint8_t ReadADC()
{
    ADMUX = (1 << MUX3) | (1 << REFS0) | (1 << REFS1) | (1 << ADLAR); // (1)
    ADCSRA |= (1 << ADEN) | (1<<ADSC) | (1 << ADPS2) | (1 << ADPS1)
              | (1 << ADPS0) | (1 << ADIE);

    while( ADCSRA & (1<<ADSC) );
    return ADC;                                                       // (2)
}

您(1)选择ADLAR,因此模数转换结果向16位ADCH:ADCL对的高位移动。但随后(2)您读取16位值并通过抛出高8位将其转换为8位值。因此,您将得到两个最低有效位的ADC结果,以及两个最高有效位的返回值。因此,这些位只能编码0、64、128、192。

代码语言:javascript
复制
uint8_t SPI_transmit_data()
{
    PORTB &= ~(1 << PB0);
    SPDR = ADC;                              // (2)
    while(!SPSR & (1<<SPIF));

    PORTB |= (1 << PB0);
    return(SPDR);
}

这里也是一样,模数转换结果的最低8位写入8位SPDR,更高的8位被丢弃。

使用ADCH而不是ADC

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59593790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档