我正在尝试使用 ATmega328P 制作接近传感器。我正在使用板载 ADC 转换电压值,如果它高于环境值,则 LED 会亮起。
在电路中,VOUT 将进入 ADC 通道 3 并且应该被感应(将右侧的 LED 视为 IR 传感器)。
当程序启动时,它会感应 30 个读数并将它们的平均值用作环境设置。如果任何后续测量值高于此值,则 LED 应点亮。
但是即使我将手放在传感器上方,LED 也不亮。
我只用 LED 测试过 IR 传感器是否正常。顺便说一句,没关系。
微控制器的代码如下:
/*
* 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;
}
}
我认为代码中存在一些问题。请帮忙。