带步进电机的AtmegaDRVB885驱动器

问题描述

我目前正在为一个带有三个步进电机的学校项目工作,为此,我正在使用nema17步进电机和DRVB885步进电机驱动器。驱动程序是由arduino mega 2560控制的。我想控制三件事,即电机的步长(PWM脉冲数),电机的速度(PWM周期时间)和电机的方向。我编写了一个程序来完成这三件事,不幸的是我的程序无法完成工作。我没有收到任何错误或警告(与c中的大多数时间一样),并且在程序运行时很难旋转步进电机的轴。电机确实发出任何噪音,这将我推向电机被引导的方向,但脉冲或设置的持续时间错误。有人有主意吗?

这是我编写的代码

#define F_cpu 16000000ul 

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "basic_help.h"

#define motor_a 1
#define dir_a_pin 1 //A1 - F
#define step_a_pin 3 //6 - H


void motor_setup() {
    
    pinmodeOutput(step_a_pin,&DDRH);
    pinmodeOutput(dir_a_pin,&DDRF);
    
    digitalWrite(en_a_pin,1,&DDRD); // disable motor
    digitalWrite(dir_a_pin,&DDRF); // set initial motor direction
    
    TCCR3A = 0;
    TCCR3B = 0;
    TCCR3A = (1<<COM3A1) | (1<<COM3B1) | (1<<WGM31) | (1<<WGM30); //clear timer on compare match & set timer at bottom - set pwm to fast pwm - 
    TCCR3B = (1<<CS30) | (1<<CS32) | (1<<WGM33) | (1<<WGM32);  //internal clock with CLK/1024 prescaling
    TimsK3 = (1<<OCIE3A) | (1<<OCIE3B); //generate intterrupt when matches B register
    
};

int aantal_stappen;

ISR(TIMER0_COMPA_vect)      //PWM => COMPA  MAX,COMPB
{
    if(aantal_stappen>0)
    {
        digitalWrite(dir_a_pin,&DDRF); // enable direction
        digitalWrite(step_a_pin,&DDRH); // set pin PWM
        aantal_stappen--;
        
    }
    else if(aantal_stappen<0)
    {
        digitalWrite(dir_a_pin,&DDRF); // disable direction
        digitalWrite(step_a_pin,&DDRH); // set pin PWM
        aantal_stappen++;
    }
        
}
ISR(TIMER0_COMPB_vect)
{
    digitalWrite(step_a_pin,&DDRH); // reset pin PWM
}

int main(void)
{
    motor_setup();
    OCR0B = 156;   // clock of 16Mhz ==> prescaler 1024 ==> 15625  divided by 156 ==> 100hz 
    OCR0A = 50;     
    
    sei();
    aantal_stappen = 1000;
    
    while (1)
    {
    }
}


.c file basic_functions

void pinmodeOutput(int pin_nr,volatile uint8_t *ddr){
    *ddr |= (1<<pin_nr);
}

void digitalWrite(char pin_nr,int highLow,volatile uint8_t *port){
    if(highLow) {
        *port |= (1<<pin_nr);
        } else {
        *port &= ~(1<<pin_nr);
    }
}

解决方法

在不查看您的代码的情况下,我想问一下:

您知道您正在使用的硬件是否设计为可以协同工作?

我快速搜索了数据表,DRV8825步进电机驱动器专为双极步进电机设计。我不认为nema17是双极步进电机。但是话又说回来,我的步进电机知识不足。

第二,DRV8825驱动器仅具有2个输出(A和B)。但是您的步进电机需要6个输入。

强烈建议您回顾一下硬件设计,然后在此处再次检查您的问题。

如果我在哪里,我会看一下放下该驱动程序模块,并尝试以更直接的方式控制步进器(这意味着不要使用pwm)。