목표 :버튼을 이용하고 PWM을 조절하여 DC모터의 속도를 제어한다.
개발 툴 : atmel studio
개발 보드 : ATMEGA128A
PC Uart 통신 툴 : Comport master
개발 기간 : 2021년 9월 14일
소스코드
#define F_CPU 16000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <string.h>
#include <stdio.h>
#include <avr/interrupt.h> // interrupt 관련 lib가 들어 있다.
#include "uart0.h"
#include "button.h"
extern void UART0_transmit(char data);
#define DELAY 2000
// printf를 동작 시키위한 mapping작업
FILE OUTPUT = FDEV_SETUP_STREAM(UART0_transmit, NULL, _FDEV_SETUP_WRITE);
// 3번 timer / counter 를 설정
void pwm_init(void)
{
// 핀을 출력으로 설정
DDRE |= (1 <<0)|(1 <<2)|(1 <<5); // 0b00100101;
//모드 14 고속 pwm timer/counter 3번
TCCR3A |=(1 << WGM30);
TCCR3B |=(1 << WGM32);
// 비반전 모드 TOP : 0xff 비교 일치 값 : OCR3C : PE5
TCCR3A |=(1<<COM3C1);
//분주비 64 : 16000000HZ / 64 ==> 250000HZ
// 256 / 250000 == > 1.02ms , 약 1ms
// 127/ 250000 ==> 0.5 ms
TCCR3B |= (1<<CS31)|(1<<CS30); // 분주비 64
OCR3C =0;
}
int main(void)
{
pwm_init();
button_Init();
stdout = &OUTPUT;
int count =0;
int start_flag =1;
int dir =0;
int temp =0;
while (1)
{
#if 0
// 모터정지
OCR3C =0;
PORTE |= (1 <<0)|(1 <<2); //정지
_delay_ms(DELAY*2);
if((count%2)==0) {
PORTE &= (1 <<0)|(0 <<2); // 정방향
OCR3C =127; // half speed
_delay_ms(DELAY);
OCR3C =255; // full speed
_delay_ms(DELAY);
}
else
{
PORTE &= (0 <<0)|(1 <<2); // 역방향
OCR3C =127; // half speed
_delay_ms(DELAY);
OCR3C =255; // full speed
_delay_ms(DELAY);
}
count++;
#else
if(getButton1State())
{
if((start_flag%2) ==0){
OCR3C = 0;
PORTE |= 0b00000101; //PE0:1 PE2:1 정지
}
else
{
PORTE &= 0b1111011;
PORTE |= 0b0000001;
OCR3C = 130;
}
start_flag++;
}
else if(getButton2State())
{ temp =OCR3C;
if ((temp+20)<251) {
OCR3C+=20;
}
else OCR3C =250;
}
else if(getButton3State())
{ temp =OCR3C;
if ((temp-20)>49) {
OCR3C -=20;// 0.5ms
}
else OCR3C =50;
}
else if(getButton4State())
{
if(dir == 0)
{
PORTE &= 0b11111110;
PORTE |= 0b00000100;
dir = 1;
}
else if(dir == 1)
{
PORTE &= 0b11111110;
PORTE |= 0b00000001;
dir = 0;
}
}
#endif
}
}
uart0.h , button.h 는
각각 https://khj-940803.tistory.com/2 , https://khj-940803.tistory.com/4 참고
동작 동영상
'임베디드시스템 > AVR' 카테고리의 다른 글
[AVR] 세탁기 프로젝트 (0) | 2021.11.09 |
---|---|
[AVR] 단순 계산기 (0) | 2021.11.09 |
[AVR] LED(command work) + FND(Stopwatch+분.초시계) + LCD Display (DS1302 시간 command setting) (0) | 2021.11.05 |
[AVR] DS1302 RTC 값을 I2C LCD에 Display (0) | 2021.11.04 |
[AVR] DS1302 clock settime 예외처리 (0) | 2021.11.03 |
댓글