摘要:内部温度无法连接到正确的 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/