BASIC4MCU | 질문게시판 | 답변 : 조도 센서를 이용하여 pwm모드로 led밝기 조절
페이지 정보
작성자 master 작성일2023-12-02 21:05 조회1,773회 댓글2건본문
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
//
uint8_t FND_TABLE[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F}; // 7-segment display values 0~9
//
void display_number(uint16_t number){
uint8_t digits[4]; int i;
digits[0]= number/1000;
digits[1]=(number%1000)/100;
digits[2]=(number% 100)/ 10;
digits[3]= number% 10;
for(i=0;i<4;i++){ PORTA=FND_TABLE[digits[i]]; PORTC=~(1<<i); _delay_ms(5); }
}
//
int main(void){
uint16_t light_sensor_value; uint8_t pwm_value;
DDRA=0xFF; // 7-segment display
DDRC=0x0F; // Common cathode 4-digit 7-segment display
DDRB=0x10;
DDRD=0xFF; // Output for PWM LEDs
ADCSRA=0xE7; ADMUX=0x02; // PF2
TCCR0|=(1<<WGM01)|(1<<WGM00)|(1<<COM01)|(1<<CS01)|(1<<CS00);
while(1){
_delay_ms(1);
light_sensor_value=ADC;
light_sensor_value<<=2; // 10비트를 8비트로 만듬
display_number(light_sensor_value);
OCR0=light_sensor_value;
PORTD=light_sensor_value;
}
return 0;
}
특별히 눈에 띄는 문제는 안보입니다.
이 코드로 다시 돌려보세요
댓글 2
조회수 1,773아자자자자자님의 댓글
아자자자자자 작성일
while(1){
_delay_ms(1);
light_sensor_value=ADC;
light_sensor_value<<=2; // 10비트를 8비트로 만듬
display_number(light_sensor_value);
if (light_sensor_value <= 150) {
OCR0 = 255;
if(PINB & 0b00010000) PORTD = 0b10101010; // Assuming PB4 is used for LED control
else PORTD = 0b00000000;
}
else if (light_sensor_value <= 300) {
OCR0 = 127;
if(PINB & 0b00010000) PORTD = 0b01010101;
else PORTD = 0b00000000;
}
else {
PORTD = 0x00;
}
}
return 0;
}
이런 느낌으로 특정 값일때 led 밝기를 100% 50% 0% 로 조절하고 싶은데 위에 처럼 하면 PORTD에 출력 되는 led 값의 밝기에는 변화가 없는데 어떻해야 할까요?
master님의 댓글
master 작성일
light_sensor_value
이 값이 150,300 전후로 변화 하는 것을 확인하세요
//
LED 빛은 0%와 100%는 당연히 구분이 확실하지만
50%와 100%는 사람 눈으로 차이가 크지 않습니다.
while(1){
OCR0=127; _delay_ms(500);
OCR0=255; _delay_ms(500);
}
}
A4용지를 LED에 대서 반사되는 빛을 본다거나
A4용지로 LED를 덮어서 투과되는 빛을 본다거나 하면
50%와 100%의 빛이 구분되기는 합니다.
물론 조도계로 측정하면 50%와 100%가 확실히 구분됩니다.