질문게시판 > 모터

인기검색어 > 아두이노 센서 ATMEGA128

최신글 질문게시판 동영상강좌 가입하기

▼ BASIC4MCU 후원업체 신제품 정보 ▼

▲ BASIC4MCU 후원업체 신제품 정보 ▲

BASIC4MCU > 질문게시판

모터

페이지 정보

작성자 룰루 작성일21-12-24 09:26 조회1,957회 댓글3건

본문

#include <avr/io.h>

#define kilo 1000UL
#define Mega (kilo*kilo)
#define F_CPU 16*Mega
#include <util/delay.h>
#include <avr/interrupt.h>

#define ST0P  0
#define GO    1

#define MODE1 0
#define MODE2 1
#define MODE3 2
#define NULL 0

void current_motor(void);
void current_sw(void);
void mcu_timer2_fPWM(void);
//void mcu_timer0_ctc(void);
void mcu_exinterrupt_switch(void);
void chattering(char);

struct op
{
  volatile uint8_t state;
  volatile uint8_t mode_sel;
  uint8_t array_ocr2[];     
  //struct op *next;
 
}motor_op =
{
 ST0P,   
 MODE3,  //after reset "MODE3" trans to "MODE1" by INT4
 { 76,156,220 } //TCNT2(256),30%,60%,90%
};

int main()
{
  current_motor();
  current_sw();
  mcu_timer2_fPWM();
  mcu_exinterrupt_switch();
   
  struct op *ptr = &motor_op;
  DDRA = 0xff;
 
 while(1)
 {
 
  if(ptr->state)
  {
      switch(ptr->mode_sel)
      {
      case MODE1:  OCR2 = ptr->array_ocr2[0]; PORTA=0x10;  break;
      case MODE2:  OCR2 = ptr->array_ocr2[1]; PORTA=0x20;  break;
      case MODE3:  OCR2 = ptr->array_ocr2[2]; PORTA=0x40;  break;
      }
 
 
  }else  {
    PORTA ^= 0x01;
    _delay_ms(100);
  }
  }
}



void current_motor(void)
{
  DDRB = (1<<DDB6)|(0<DDB7); //for use OC2 (1<<DDB7)  //enabled by ISR(INT4_vect).
}


void mcu_timer2_fPWM(void)
{

TCCR2 = (1<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<CS22)|(0<<CS21)|(1<<CS20); //OC2: enable (COM21:0 =2)
        //(fast mode)        ( clear:up, set:down)  (clock : 1024) = small motor didn't respond high frequency
/*--OCF2-------*/   
//TIMSK = (1<<OCR2);  //timer2: compare match interrupt enable. //ISR(TIMER2_COMP_VECT) : enable.
}

/*--ISR OCF2-------*/     
ISR(TIMER2_COMP_vect) 
{

  /*none*/

}



void current_sw(void)
{
  DDRE = 0xff;
  DDRE ^= (1<<DDE4)|(1<<DDE5);  //default: 0  //use for INT4,5 port pin function enable.
}

void mcu_exinterrupt_switch(void)
{
 EIMSK = (1<<INT4)|(1<<INT5);  // INT4,5 enable.
 EICRB = (1<<ISC41)|(0<<ISC40)|(1<<ISC51)|(0<<ISC50); //interrupt source collect, trigger: rising edge.
 sei();
}
void chattering(char num)
{
  EIFR= (1<<num);
  _delay_ms(30);

}

ISR(INT4_vect)               
{                            // mode1 mode2 mode3
  static uint8_t trans_mode[3] = {MODE2,MODE3,MODE1}; 
  motor_op.mode_sel = trans_mode[motor_op.mode_sel];   
                                  //stop  go
  static uint8_t trans_array[2] = { GO, GO };
  motor_op.state = trans_array[motor_op.state];   
  DDRB |= 1<<DDB7; //motor: start. (DDR: connect OC2 signal)
  chattering(4);
}

ISR(INT5_vect)               
{                                //mode 1 mode2 mode3
  static uint8_t trans_mode[3] = {MODE3,MODE3,MODE3};
  motor_op.mode_sel = trans_mode[motor_op.mode_sel];
                          // stop go
  static uint8_t tran_array[2] = {ST0P,ST0P};
  motor_op.state = tran_array[motor_op.state];
  DDRB &= 0<<DDB7; // motor: stop (DDR: cut OC2 signal)
  OCR2 = 0;
  chattering(5);
}
프로젝트 설명 : 

 

SW1을 한 번 누르면 미풍, 두번 누르면 약풍, 세번 누르면 강풍, 네번 누르면 다시 미풍이 되며, SW2를 누르면 정지가 되는 모터를 작동하고 싶은데 작동이 안됩니다ㅠ 어디가 문제인가요...
  • BASIC4MCU 작성글 SNS에 공유하기
  • 페이스북으로 보내기
  • 트위터로 보내기
  • 구글플러스로 보내기
  • 카카오톡으로 보내기

댓글 : 3

조회수 : 1,957

master님의 댓글

master 작성일

EICRB=(1<<ISC41)|(0<<ISC40)|(1<<ISC51)|(0<<ISC50);
이 설정은 상승엣지가 아니고 하강엣지입니다.
코드가 복잡해서 한번에 파악은 안되지만
각각의 인터럽트 및 PWM등은 하나씩 차근차근 제대로 코딩을 했는지 일일이 확인해야 합니다.

master님의 댓글

master 작성일

#include <avr/io.h>
#include <avr/interrupt.h>
#define  F_CPU 16000000UL
#include <util/delay.h>
//
volatile char mode=0;
//
ISR(INT4_vect){
  if(++mode>3)mode=1;
  //
  if(mode==1){ OCR2= 76; PORTA=0x10; }
  if(mode==2){ OCR2=156; PORTA=0x20; }
  if(mode==3){ OCR2=220; PORTA=0x40; }
  //
  _delay_ms(50); EIFR=0x30;
}
//
ISR(INT5_vect){ mode=0; OCR2=0; PORTA=0; }
//
int main(){
  DDRA=0xff; DDRB=0xC0;
  TCCR2=(1<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<COM20)|(1<<CS22)|(0<<CS21)|(1<<CS20);
  EICRB=0xAA; EIMSK=0x30; sei();
  while(1){}
}

룰루님의 댓글

룰루 댓글의 댓글작성일

이부분만 수정해도 되는 건가요??

게시물 검색

BASIC4MCU > 질문게시판 목록

제목 날짜
공지 MCU, AVR, 아두이노 등 전자공학에 관련된 질문은… 스태프  19-01-15
공지 사이트 이용 안내 댓글[25] master  17-10-29
질문 해석좀 해주세요 댓글[1] bubu 새글 22-08-14
질문 lcd 1602에 특수문자를 출력하는 방법을 알고싶습니… 댓글[3] dndktn  22-08-12
질문 stm32 wifi 파일전송 댓글[3] 하리  22-08-11
질문 회로 구성 수정 댓글[2] 첨부파일픽공부  22-08-11
질문 아두이노 와이파이통신 질문 있습니다 댓글[1] 학생  22-08-11
질문 포토다이오드와의 연결 질문합니다. 댓글[7] 첨부파일박윤모  22-08-10
질문 회로 구성 댓글[4] 픽공부  22-08-10
질문 아두이노 센서, 와이파이, 블루투스 연결 댓글[1] pattern  22-08-10
질문 PIC 블루투스 연결 댓글[19] 픽공부  22-08-09
질문 PIC18F452 블루투스 연결 댓글[4] 마이컴  22-08-08
질문 아두이노 코드 해석을 못하겠습니다... 댓글[2] 김가헌  22-08-08
질문 아두이노 코드를 avr로 변환해 주세요 ...ㅠ 댓글[3] 옹냥냥  22-08-08
질문 아두이노 녹음-스피커모듈 관련 질문있습니다 ㅠㅠ 댓글[2] 방귀뿡뿡  22-08-08
질문 Serial EEPROM 실수값 저장.. 댓글[2] 첨부파일광이  22-08-07
질문 STM32 Live Expression 값들이 깜빡이는… 댓글[3] 둠둠  22-08-05
질문 아두이노 ESP32 wifi module 댓글[1] Yoon  22-08-03
질문 atmega128과 dht11, lcd를 연결했는데 0… 댓글[1] 고양이33  22-08-02
질문 ATMEGA 128 코드를 합치려고 하는데 어렵네요 댓글[2] 고양이33  22-08-02
질문 서보모터 제어에 대해 질문있습니다. 댓글[2] 첨부파일뉴비에오  22-07-30
질문 적외선 통신 알려주실분있나요 ㅠㅠ 댓글[1] hkjsj10  22-07-30
질문 아두이노 관련 궁금합니다. 댓글[1] 뱝뱝  22-07-28
질문 아두이노 우노 MCP4725 댓글[3] opqr  22-07-27
질문 레오나르도 인체감지센서 알림 안옴 면지지  22-07-24
답변 답변 : 레오나르도 인체감지센서 알림 안옴 master  22-07-25
질문 Uno에서 엔코더값 놓치는 이유가 뭘까요... 댓글[3] MAKTUB  22-07-24
질문 아두이노 압력센서 연동 질문 댓글[4] dbice  22-07-23
질문 아두이노 버튼 누르기 문의 댓글[1] 김형근  22-07-23
질문 HM10 다중페어링 댓글[1] ㅎㅋㅎㅋㅎ  22-07-22
게시물 검색


Privacy Policy
MCU BASIC ⓒ 2017
PC버전