arduino,avr
아두이노 기초 : L LED점멸
ds97l
2022. 2. 21. 15:59
아두이노 내부 L LED 점멸
Fast PWM은 0~255의 duty비에서 0일때 1/256의 비를 가지므로 완전한 0이 될 수 없다
완전히 led를 끌수 없는 이유이며 이를 해결하기 위해선 phase-correct PWM 으로 수정할 필요가 있다.
아두이노로 구현
void setup() {
// initialize digital pin LED_BUILTIN as an output.
pinMode(LED_BUILTIN, OUTPUT);
}
// the loop function runs over and over again forever
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // turn the LED on (HIGH is the voltage level)
delay(1000); // wait for a second
digitalWrite(LED_BUILTIN, LOW); // turn the LED off by making the voltage LOW
delay(1000); // wait for a second
}
AVR
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
int main(void)
{
DDRB = 0xFF;
while (1)
{
PORTB = 0x20; //PORTB_5 PIN13에 의해 LED제어
_delay_ms(1000);
PORTB = 0x00;
_delay_ms(1000);
}
}
외부 LED 연결해서 점멸
PB4(PIN12)와 ground에 연결
저항 100옴 사용
주기 2초
arduino
void setup()
{
pinMode(12, OUTPUT);
}
void loop()
{
digitalWrite(12, HIGH);
delay(1000);
digitalWrite(12, LOW);
delay(1000);
}
avr
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
int main(void)
{
DDRB = 0xFF;
while (1)
{
PORTB = 0x10;
_delay_ms(1000);
PORTB = 0x00;
_delay_ms(1000);
}
}
LED2개 번갈아가며 점멸
arduino
void setup(){ // 초기설정
pinMode(12, OUTPUT);
pinMode(11, OUTPUT);
}
void loop(){ // 실행부
digitalWrite(12, HIGH);
delay(500);
digitalWrite(12, LOW);
delay(500);
digitalWrite(11, HIGH);
delay(500);
digitalWrite(11, LOW);
delay(500);
}
avr
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
int main(void)
{
DDRB =0xFF;
while(1)
{
PORTB=0x10;
_delay_ms(500);
PORTB=0x00;
_delay_ms(500);
PORTB=0x08;
_delay_ms(500);
PORTB=0x00;
_delay_ms(500);
}
}
밝기 조절
arduino
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
int main(void)
{
DDRB = 0xFF; // OC0(PB4)출력설정
TCCR1A = 0b10000001;
TCCR1B = 0b00001010;
while(1) // 00 : 0%, 3F : 25%, 7F : 50%, BF : 75%, FF : 100%
{
OCR1A = 0x00; //완전히 꺼지지않음 COM1A1, COM1A1 10에서 11로 넣고 아래 수정했을땐 완전히 꺼짐
_delay_ms(1000);
OCR1A = 0x2F;
_delay_ms(1000);
OCR1A = 0x4F;
_delay_ms(1000);
OCR1A = 0x8F;
_delay_ms(1000);
OCR1A = 0xFF;
_delay_ms(1000);
}
}
색깔변경
arduino
void setup()
{
Serial.begin(115200);
}
void loop()
{
analogWrite(9,255); //R255~0 밝아짐
analogWrite(6,255);//G
analogWrite(5,255);//B
}
avr FAST PWM 0x00시 duty비가 1/256 희미하게 불이 들어옴
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
int main(void)
{
DDRB = 0xFF;
DDRD = 0xFF;
TCCR1A = 0b11000001; //Inverting mode, FastPWM 8-bit
TCCR1B = 0b00001010; //clk/8분주
TCCR0A = 0b11110011;
TCCR0B = 0b00000010;
while(1) // 00 : 0%, 3F : 25%, 7F : 50%, BF : 75%, FF : 100%
{
OCR1A = 0xFF; //RED 00~FF PIN12
OCR0A = 0xFF;//GREEN 00~FF PIN6
OCR0B = 0xFF;//BLUE 00~FF PIN5
}
}
avr phase correct mode 0x00시 duty비 0% 완전히 꺼짐
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
int main(void)
{
DDRB = 0xFF;
DDRD = 0xFF;
TCCR1A = 0b11000001;// Inverting mode, Phase Correct 8-bit
TCCR1B = 0b00000010; //clk/8분주
TCCR0A = 0b11110001;
TCCR0B = 0b00000010;
while(1) // 00 : 0%, 3F : 25%, 7F : 50%, BF : 75%, FF : 100%
{
OCR1A = 0xFF; //RED 00~FF PIN12
OCR0A = 0xFF;//GREEN 00~FF PIN6
OCR0B = 0xFF;//BLUE 00~FF PIN5
}
}
스위치로 LED제어
const int bntPin =2;
const int ledPin =12;
int bntState =LOW;
void setup(){
pinMode(ledPin, OUTPUT);
pinMode(bntPin, INPUT);
}
void loop(){
bntState = digitalRead(bntPin);
if ( bntState == HIGH){
digitalWrite(ledPin, HIGH);
}
else {
digitalWrite(ledPin, LOW);
}
}
avr
#include <avr/io.h>
#define F_CPU 16000000UL
#include <util/delay.h>
int main(void)
{
DDRD = 0x00; // (PD2)입력설정
DDRB = 0xFF; // (PB4)출력설정
while(1)
{
if((PIND&0x04) != 0)
{
PORTB = 0x10;
}
PORTB =0x00;
}
}
LED PIN2~7까지 번갈아가며 키기
arduino
void setup() {
for (int i = 2; i <= 7; i++) {
pinMode(i, OUTPUT);
digitalWrite(i, LOW);
}
}
void loop() {
for (int i = 2; i <= 7; i++) {
digitalWrite(i, HIGH);
delay(1000);
digitalWrite(i, LOW);
}
}
avr
#include <avr/io.h>
#define F_CPU 16000000UL
#include "util/delay.h"
int main(void)
{
DDRD = 0xFF;
while (1)
{
PORTD = 0x04;
_delay_ms(1000);
for(int i = 0; i<5; i++)
{
PORTD = PORTD << 1;
_delay_ms(1000);
}
}
}