BASIC4MCU | 질문게시판 | 조도 센서를 이용하여 pwm모드로 led밝기 조절
페이지 정보
작성자 아자자자자자 작성일2023-12-02 19:22 조회842회 댓글0건본문
안녕하세요 조도센서 값을 받아와서 7 segment에 입력하고 조도센서 값에 따라 led 밝기를 조절하는 코드를 작성하고 있습니다.
pwm_value에 값에 따라서 portD에 연결된 LED값은 변하는데 LED밝기는 변하지 않아서 뭐가 문제인지 모르겠습니다.
set_pwm(128) 코드가 재대로 작동되지 않는거 같은데 즉 PWM모드가 재대로 안되고 있습니다. 도움주시면 감사하겠습니다.
또 7 segment 값이 뚜렸하지가 않고 첫째자리만 뚜렷하게 보이고 나머지는 너무 깜빡거리는데 방법이 있을까요?
#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 adc_init() {
ADMUX = 0x02; // Use ADC0 as input
ADCSRA = (1 << ADEN) | (1 << ADPS2) | (1 << ADPS1) | (1 << ADPS0); // Enable ADC and set prescaler to 128 (for 16MHz clock)
}
uint16_t read_adc() {
ADCSRA |= (1 << ADSC); // Start ADC conversion
while (ADCSRA & (1 << ADSC)); // Wait for conversion to complete
return ADC;
}
void display_number(uint16_t number) {
uint8_t digits[4];
digits[0] = number / 1000;
digits[1] = (number % 1000) / 100;
digits[2] = (number % 100) / 10;
digits[3] = number % 10;
for (int i = 0; i < 4; i++) {
PORTA = FND_TABLE[digits[i]];
PORTC = ~(1 << i);
_delay_ms(5);
}
}
void pwm_init() {
TCCR0 |= (1 << WGM01) | (1 << WGM00) | (1 << COM01) | (1 << CS01) | (1 << CS00);
DDRD = 0xFF; // Output for PWM LEDs
}
void set_pwm(uint8_t duty_cycle) {
OCR0 = duty_cycle; // Set PWM duty cycle
}
int main(void) {
DDRA = 0xFF; // 7-segment display
DDRC = 0x0F; // Common cathode 4-digit 7-segment display
DDRB = 0x10;
adc_init(); // Initialize ADC
pwm_init(); // Initialize PWM for LED control
while (1) {
uint16_t light_sensor_value = read_adc();
display_number(light_sensor_value);
// Adjust LED brightness based on light sensor value
uint8_t pwm_value = light_sensor_value;
if(pwm_value > 255)
pwm_value = 255;
if (pwm_value <= 63) /* 63 in binary */ {
PORTD = 0b10101010;
set_pwm(255);
} else if (pwm_value <= 200) /* 127 in binary */ {
PORTD = 0b01010101;
set_pwm(128);
} else {
set_pwm(0);
PORTD = 0x00;
}
// Delay to stabilize readings and avoid flickering
_delay_ms(100);
}
return 0;
}
댓글 0
조회수 842등록된 댓글이 없습니다.