모터 > 변속기 - Davide Gironi - speed

TODAY1,226 TOTAL2,922,662
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 모터 | BLDC모터 | 변속기 - Davide Gironi - speed

페이지 정보

작성자 키트 작성일2017-09-05 15:17 조회1,747회 댓글0건

본문

//---------------------------------------------------------------------------------------------------------
void set_stop() { if( enabled){ SREG&=0x7F; enabled=0; STOP; SREG|=0x80; } } /* * set stop */
void set_start(){ if(!enabled){ SREG&=0x7F; enabled=1;       SREG|=0x80; } } /* * set start */
//---------------------------------------------------------------------------------------------------------
//---------------------------------------------------------------------------------------------------------
U_I adc_read(){ U_I adc; ADCSRA|=0x40; while(!(ADCSRA&0x10)); adc=ADCW; ADCSRA|=0x10; return(adc); }
//---------------------------------------------------------------------------------------------------------

void main(void){
    U_I pot_speed=0;
    //
    ADCSRA=0x83;  // Prescaler 8
    //
    TCCR1B=0x0A; TIMSK=0x10;  // 0.5us*200=10us
    //
    dir_old=!DIR_SW;
    //
    while(1){
        if(DIR_SW!=dir_old){ dir=dir_old=DIR_SW;        // 회전 방향이 변경 되었을 때만 동작
            set_stop();                                 // 모터 정지
            ADMUX=3; pot_speed=adc_read();              // 속도조절 가변저항 모터 정지 시에만 읽음
            OCR1A=(U_I)((float)pot_speed*100.0/1023.0); // 0~100으로 변환
            delay_ms(2000);                             // wait for the motor to stop
            startup_motor(); set_start();               // 모터 구동
        }
    }
}
//
ADC채널3번의 가변저항을 읽어서 0~100으로 변환 한 후에 OCR1A에 넣어서 타이머1 인터럽트의 주기로 사용하고 있습니다.
    TCCR1B=0x0A; TIMSK=0x10;  // 0.5us*100=5us
타이머 클럭이 0.5us라서
100을 설정하면 50us 주기가 됩니다.
//
속도를 변경 하려면 속도 조절용 가변을 변경 한 후 DIR_SW 스위치를 변경 해줘야합니다.
언제든지 속도를 변경 할 수 있어야지 속도 변경 할 때마다 회전방향 스위치로 모터를 정지시키고 다시 가동하는 것은 좀 아니죠?
타이머 인터럽트에서 ADC를 사용하고 있어서 메인에서 ADC를 건드리지 못합니다.
가변저항 설정값을 읽으려면 타이머 인터럽트 안에서 읽어야합니다.

ADCSRA=0x83;  // Prescaler 8
ADC 분주비가 8이라서 변환 시간은 몇us 안걸립니다.
16000000Hz/8/13=153846.15384615384615384615384615Hz=0.0000065sec=6.5us
adc_read() 함수를 실행 시키면 얼추 10us 정도가 되지 않을까 싶습니다.

interrupt [TIM1_COMPA] void timer1_compa_isr(void){ /* * main bldc timer */
    if(enabled){
        if(emissions){ emissions=0;
            STOP; delay_us(10); FET_PORT=commut_table[commut_step];

타이머 인터럽트 안에 딜레이를 사용하고 있으니 저 시간에 가변저항값을 읽어도 되겠습니다.^^

댓글 0

조회수 1,747

등록된 댓글이 없습니다.

모터HOME > 모터 > BLDC모터 목록

게시물 검색

2022년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2021년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2020년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2020
모바일버전으로보기