【发布时间】: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);
}
}
【问题讨论】: