我正在嘗試使用ATmega328P製作接近傳感器。我正在使用板載ADC轉換電壓值,如果它高於環境溫度,LED將點亮。無法在atmega328上使用ADC
在該電路中,VOUT是要ADC通道3,並應被感測(認爲導致右側作爲紅外線傳感器的)。
程序啓動時,它會感應30個讀數,並將其平均值用作環境設置。如果任何後續測量結果高於此值,LED應亮起。
但即使將手放在傳感器上方,LED也不會點亮。
我已經測試了只有LED,看看紅外傳感器是否正常。順便說一句。
微控制器的代碼如下:
/*
* Proximity Sensor IR.c
*
* Created: 6/3/2017 2:35:33 PM
* Author : Rishav
*/
#include <avr/io.h>
#include <stdio.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int calibration()
{
unsigned int sum = 0;
for (int i=0; i<30; i++)
{
ADCSRA |= (1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
ADCSRA |= (1<<ADIF);
sum += (ADCH<<8)|ADCL;
}
return (sum/30);
}
int main(void)
{
unsigned int val = 0;
ADMUX |= (0<<REFS1)|(1<<REFS0)|(0<<MUX3)|(0<<MUX2)|(1<<MUX1)|(1<<MUX0); //setting the multiplexer to ADC3
ADCSRA |= (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
DDRB = 0b00000010;
DDRD |= (1<<PCINT22);
PORTD |= (1<<PCINT22);
int calib_value = calibration();
while (1)
{
ADCSRA |= (1<<ADSC);
while(!(ADCSRA & (1<<ADIF)));
val = (ADCH<<8)|ADCL;
ADCSRA |= (1<<ADIF);
if (val > calib_value)
PORTB = 0b00000010;
}
}
我認爲這是在代碼中的一些問題。請幫忙。
這些行沒有意義,因爲PCINT22在任何一個寄存器中都沒有位:'DDRD | =(1 << PCINT22); PORTD | =(1 << PCINT22);' –
我不使用PCINT,只是使用端口D中的PCINT引腳位置打開IR LED。 – Ris97
你可以用0到7之間的數字代替'PCINT22',它會使你的代碼更加清晰。例如,如果您想控制PD5,請將其替換爲5. –