c - Arduino 内部温度

标签 c

摘要:内部温度无法连接到正确的 channel 。
希望从 channel 中获得正确的值(value)。

#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); 
  }
}

最佳答案

我同意评论 - 您应该阅读 DS、ADC 转换结果和温度测量部分。

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

参见:

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,因此 ADC 结果移向 16 位 ADCH:ADCL 对的高位。但随后 (2) 读取 16 位值,并通过丢弃高 8 位将其转换为 8 位值。因此,您将在返回值的两个最高有效位中得到 ADC 结果的两个最低有效位。因此,这些位只能编码 0、64、128、192。

uint8_t SPI_transmit_data()
{
    PORTB &= ~(1 << PB0);
    SPDR = ADC;                              // (2)
    while(!SPSR & (1<<SPIF));

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

这里也是一样,ADC结果的低8位被写入8位SPDR,高8位被丢弃。

使用ADCH而不是ADC

关于c - Arduino 内部温度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59593790/

相关文章:

c - C语言中的TCP校验和

c - strcmp 是线程安全的吗?

c - 如何在此示例中实现数组

c - 编译时出现警告,程序为 'waits/delays'

错误代码枚举的 C 命名建议

将原始 14 位二进制补码转换为带符号的 16 位整数

c - 使用 makefile 时未定义对 `main' 的引用

c - 这段代码在VC6.0中会崩溃吗?

c++ - Mathematica/CUDA 减少执行时间

c - 暂停破坏 shell