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 stopstartup_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 8ADC 분주비가 8이라서 변환 시간은 몇us 안걸립니다.16000000Hz/8/13=153846.15384615384615384615384615Hz=0.0000065sec=6.5usadc_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등록된 댓글이 없습니다.