mrb, Atmega 328 kullanarak yaptığım step motor hız ve yön kontrol devresinde ADC den dolayı hız sorunu yaşıyorum. yön kontrolünü 2 butonla, hız kontrolünü ise potansiyometreden aldığım analog veriyle sağlıyorum. Motor butona bastığımda dönerken sürekli hız değiştiriyor. potansiyometrenin orta bacağını ölçtüğümde ise her iki yöndede herhangi bir gerilim değişikliği olmuyor. yani sorun ADC çevriminde. motor dönerken her 30 mSn de bir pottan hız kontrolü sağlamak için ADC conversion complete kesmesini timer0 overflow ile tetikledim ve ADC yi 125kHz de kullanıyorum... lütfen biri bana yardım etsin
#include <avr/io.h>
#define F_CPU 8000000
#include <util/delay.h>
#include <avr/interrupt.h>
volatile int v[4]={3,6,12,9},temp,i,j,k;
int Read_adc(int);
int saga_don();
int sola_don();
void timer0_init(){
TCNT0=0;
TIMSK0=(1<<TOIE0);
TCCR0B=0X05; // prescalar 1024
sei();
}
// (1024/8*10^6)*255=32.6 mSn
ISR(ADC_vect){
temp=ADCW;
}
ISR(TIMER0_OVF_vect){
}
int saga_don(){
while(bit_is_clear(PINB,4)){
for (i=0; i<=3; i++){
PORTB=v[i];
gecikme(temp);
_delay_us(125);
}
}
PORTB=0x00;
_delay_ms(50);
}
int sola_don(){
while(bit_is_clear(PINB,5)){
for (j=3; j>=0; j--){
PORTB=v[j];
gecikme(temp);
_delay_us(125);
}
}
PORTB=0x00;
_delay_ms(50);
}
void adc_init(){
ADMUX= 0x45; // referance voltage is Avcc, ADC pin is selected 5
ADCSRA = 0xAE; // prescalar is used 64, ADEN,ADATE,ADIE,ADPS1,ADPS2 bits are set
ADCSRB |=(1<<ADTS2); // trigger source is timer0 overflow
}
void gecikme(int z){
for(k=0; k<=z; k++)
_delay_us(5);
}
void step_kontrol(){
while(1){
if(bit_is_set(PINB,5)){ // SAĞA DÖN
saga_don();
}
else if(bit_is_set(PINB,4)){ // SOLA DÖN
sola_don();
}
else{
while( (PINB & 0X30)==0X00 ){
PORTB=0x00;
}
}
}
}
int main(){
DDRB= 0x0f;
adc_init();
timer0_init();
while(1){
step_kontrol();
}
return 0;
}