뉴티씨



  • HOME
  • 고객지원
  • 질문답변


 
AM-DC2-2D모터가 PWM 조절이 안되네요. 뭐가 불량인지 모르겠습니다. 뭐자 잘못된는지 좀 알려주세요.
 글쓴이 : 관리자
작성일 : 19-10-14 21:26
조회 : 51  

안녕하세요 고객님,
저희 뉴티씨 제품을 이용하여 주셔서 감사합니다.

해당 소스에 PWM핀의 제어가 들어가 있지 않은 것 같습니다.

현재는 메인 while문에서 전부다 제어를 하고 있는데, while 루프문에
PB0(PWM1)관련된 내용이 없습니다.

타이머값을 조절하셔서 하시는 것 같은데,
해당 타이머의 인터럽트를 작성하셔서, 인터럽트가 발생할 때 핀을 ON,OFF하시면서
PWM파형을 만드시면 될 것 같습니다.

타이머가 가변으로 조절됨에 따라 발동시간이 다를 것이고,
발동시간에 따라서 ON된시간, OFF된 시간이 길고 짧아지면서
듀티비가 정해질 것입니다.

관련 사진 첨부해드립니다.

감사합니다.

>
>
> 이프로그램시 동작품은 AM-DC2-2D, SE-DM, SE-WDC2, AVR USB-JTAG 사용했는데요.
>
> 소스상으로는 main 함수에 무한반복문에서 속도선택 값과 딜레이 시간이 나와서 PWM제어가
> TCCR2에 의해서 제어가 되어야 하는데 제어가 안되는데요.
>
> AM-DC2-2D드라이버를 사용할때 아래와 같이 프로그램 하는것이 틀리나요?
> 틀린것이라면 뭐가 잘못된것인지 알려주세요.
>
> (프로그램 내용은 저속, 중속, 고속, 정지의 기능을 가지며, 각 기능이 임의의 순서, 임의의 시간,(최소 3초,
> 최대 6초)만큼 동작하는 선풍기를 제작한다. LED 4개는 고속, 중속, 저속, 정지의 상태를 알수 있도록 순서대로 대응되게 할당하여 모터를 움직이도록 프로그램 하는 내용입니다.)
>
> #include <stdlib.h>
> #include <avr/io.h>
> #define F_CPU 16000000UL
> #define __DELAY_BACKWARD_COMPATIBLE__
> #include <util/delay.h>
>
>     // motor speed
> #define  stop_speed      0 // duty cycle  0%의 값
> #define low_speed     77 // duty cycle 30%의 값(255*0.3)                                                                               
> #define  midle_speed 153 // duty cycle 60%의 값(255*0.6)
> #define  high_speed     230 // duty cycle 90%의 값(255*0.9)
>
>
> // 모터제어
> // PB2=/ENABLE, PB1=DIR1, PB0=PWM1
> #define MOTOR_CW    0x03      // 모터 Foward        : /ENABLE1=0, DIR1=1, PWM1=1
> #define MOTOR_CCW   0x01 // 모터 Reverse      : /ENABLE1=0, DIR1=0, PWM1=1
> #define MOTOR_CW_STOP 0x02 // 모터 Foward STOP  : /ENABLE1=0, DIR1=1, PWM1=0
> #define MOTOR_CCW_STOP 0x00 // 모터 Reverse STOP  : /ENABLE1=0, DIR1=0, PWM1=0
> //#define  MOTOR_STADBY 0x04    // 모터 Standby   : /ENABLE1=1, DIR1=0, PWM1=0
>         // PWM신호는 모터 속도결정, DIR신호는 모터 방향 결정, /ENABLE = 0 신호는 모터 모터 활성화
>         // 모터 정지시키는 /ENABLE=1 로 만들면 모터 비활성화(모터 정지)
>
> volatile int count = 0, value = 0;
> int Motor_speed[4] = {stop_speed, low_speed, midle_speed, high_speed};
>
> int main(void)
> {
> DDRB = 0x0F;
> DDRA = 0x0F; // LED 출력
> PORTB = MOTOR_CCW_STOP;
> TCCR2 = 0x6B;
>
> PORTB = MOTOR_CW;
> while(1)
> {
> value = rand() % 4;                  // 랜덤값 추출
> OCR2 = Motor_speed[value];  // 속도선택, 정지, 저속, 중속, 고속중 선택
> PORTA = 1<<value;                // LED에 현재 속도 디스플레이
> value = (rand() % 4) + 3;     // 랜덤값 추출
> _delay_ms(value*1000);          // 딜레이 시간 선택, 3초, 4초, 5초, 6초 중 선택
> }
> }
>