问题描述
我目前正在为一个带有三个步进电机的学校项目工作,为此,我正在使用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)。