摘要:内部温度无法连接到正确的通道。
希望从通道中获得正确的值。
#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);
}
}发布于 2020-01-05 23:43:02
我同意您的意见-您应该阅读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,因此模数转换结果向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);
}这里也是一样,模数转换结果的最低8位写入8位SPDR,更高的8位被丢弃。
使用ADCH而不是ADC
https://stackoverflow.com/questions/59593790
复制相似问题