Tengo algunos problemas para mover mis motores paso a paso sin que haga ruido.
Leí en algún lugar que la aceleración de la frecuencia de la señal modulada por impulsos ayudaría, pero parece tener los mismos problemas también. ¿Es la "aceleración" empinada ...?
El motor paso a paso que estoy usando es un PK244-01A , y está conectado a una placa de controladores, que requiere la habilitación, dirección y paso de la señal de entrada = > que es el que estoy ramping Driverboard
HEre es el código:
void setup()
{
Serial.begin(9600);
pinMode(9, OUTPUT); //Step
pinMode(12,OUTPUT); //en
pinMode(13,OUTPUT); //dir
TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode
TCCR1B = _BV(WGM13) | _BV(CS11); // Select mode 8
// Prescaled by 8 on main clock.
}
float count = 1000; //
void loop() {
// put your main code here, to run repeatedly:
//output_freq = CPU_clk/(2*8*ICR1_value)
//ICR1 = CPU_clk/2*8*output_freq
digitalWrite(12,HIGH);
delay(1);
digitalWrite(13,HIGH);
delay(1);
ICR1 = count;
OCR1A = int(count/2);
while(1)
{
if(count != 20)
{
count -= 10;
}
}
}
The ICR1 value is computes using this formula $$ICR1 = \frac{(cpu_{freq})}{(2*prescaler*desired_{freq}))}$$
Se actualizó el código con las respuestas de @jms:
void setup()
{
Serial.begin(230400);
pinMode(9, OUTPUT); //Step
pinMode(12,OUTPUT); //en
pinMode(13,OUTPUT); //dir
TCCR1A = _BV(COM1A1) | _BV(COM1B1) ; // phase and frequency correct mode. NON-inverted mode
TCCR1B = _BV(WGM13) | _BV(CS11); // Select mode 8
// Prescaled by 8 on main clock.
}
int count = 200000;
void loop() {
// put your main code here, to run repeatedly:
//output_freq = CPU_clk/(2*8*ICR1_value)
//ICR1 = CPU_clk/2*8*output_freq
digitalWrite(12,HIGH);
delay(1);
digitalWrite(13,HIGH);
delay(1);
while(1)
{
int freq = (16000000)/(2*8*ICR1);
ICR1 = count;
OCR1A = int(count/2);
Serial.print("freq: ");
Serial.println(freq);
Serial.print('\n');
Serial.print("count: ");
Serial.println(count);
Serial.print('\n');
}