【问题标题】:Atmega with Stepper motor (DRVB885 driver)Atmega 带步进电机(DRVB885 驱动器)
【发布时间】:2021-02-13 03:11:33
【问题描述】:

我目前正在为一个带有三个步进电机的学校项目工作,为此我使用的是 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,0,&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,1,&DDRF); // enable direction
        digitalWrite(step_a_pin,1,&DDRH); // set pin PWM
        aantal_stappen--;
        
    }
    else if(aantal_stappen<0)
    {
        digitalWrite(dir_a_pin,0,&DDRF); // disable direction
        digitalWrite(step_a_pin,1,&DDRH); // set pin PWM
        aantal_stappen++;
    }
        
}
ISR(TIMER0_COMPB_vect)
{
    digitalWrite(step_a_pin,0,&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);
    }
}

【问题讨论】:

    标签: c atmega atmel stepper


    【解决方案1】:

    不看你的代码,我想问一下:

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

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

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

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

    如果我在你的位置,我会考虑放弃该驱动模块并尝试以更直接的方式控制步进器(意味着不要使用 pwm)。

    【讨论】:

    • 感谢您的回复!我认为您想到的步进电机与我的不同,nema 步进电机只有 4 根线作为最简单的步进电机。 4 根接地线,12v,a 和 b 通道。我认为硬件还可以,如果我在 arduino 中运行它运行良好。不幸的是,在 atmel 中,它只是没有运行,所以认为设置不正确
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-02
    相关资源
    最近更新 更多