#ifndef PART_TM4C123GH6PM
#define PART_TM4C123GH6PM
#endif
#include <stdbool.h>
#include <stdint.h>
#include <stdio.h>
#include <inc\tm4c123gh6pm.h>
#include "driverlib/ssi.h"
#include "driverlib/rom.h"
#include "inc/hw_memmap.h"
#include "driverlib/gpio.h"
#include "driverlib/sysctl.h"
#define data GPIO_PORTB_AHB_DATA_R
unsigned int i,j,k;
unsigned int N=512;
unsigned char eight_pos[8]={0x06,0x07,0x03,0x0b,0x09,0x0d,0x0c,0x0e}; /*八拍驱动正转*/
unsigned char eight_rev[8]={0x0e,0x0c,0x0d,0x09,0x0b,0x03,0x07,0x06}; /*八拍驱动正转*/
void delay(unsigned int z);
void m_eight_pos();
void m_eight_rev();
int main(void)
{
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOA);
SysCtlPeripheralEnable(SYSCTL_PERIPH_GPIOB);
GPIOPinTypeGPIOOutput(GPIO_PORTB_BASE, GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2 |GPIO_PIN_3 );
GPIOPinTypeGPIOInput(GPIO_PORTA_BASE, GPIO_PIN_2 | GPIO_PIN_3);
while(1)
{
if((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_2 ))==0)
{
m_eight_pos(); //八拍驱动正转360度
}
// delay(200);
else if((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_3))==0)
{
m_eight_rev(); //八拍驱动反转360度
}
// delay(200);
}
}
void delay(unsigned int z) /*延时z毫秒*/
{
unsigned int x,y;
for(x=z;x>0;x–)
for(y=110;y>0;y–) ;
}
/******************************八拍驱动正转 (N*22.5/32)*************************************/
void m_eight_pos()
{
for(k=0;k<N;k++)
{
for(i=0;i<8;i++) //八拍一个脉冲转子转动5.625/2度,八拍共 22.5度
{
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2 |GPIO_PIN_3,(eight_pos[i]&0x01)|(eight_pos[i]&0x02)|(eight_pos[i]&0x04)|(eight_pos[i]&0x08));
delay(20);
}
}
}
/******************************八拍驱动反转 (N*22.5/32)*************************************/
void m_eight_rev()
{
for(k=0;k<N;k++)
{
for(i=0;i<8;i++) //八拍一个脉冲转子转动5.625/2度,八拍共22.5度
{
GPIOPinWrite(GPIO_PORTB_BASE,GPIO_PIN_0 | GPIO_PIN_1|GPIO_PIN_2 |GPIO_PIN_3,(eight_rev[i]&0x01)|(eight_rev[i]&0x02)|(eight_rev[i]&0x04)|(eight_rev[i]&0x08));
delay(20);
}
}
}
xyz549040622:
d电机正反转51的程序已经很多了,你移植一个过来即可,有两点需要注意
1.确保可以驱动电机,电机驱动芯片是否接好
2.电机的时序是否正确
Michael Sun:
建议分开调试,先把M4的相关外设都调试正常了,然后再加入电机控制部分的逻辑。这样有问题也好定位。
yan yao:
回复 Michael Sun:
不用按键控制时,直接用延时是可以实现步进电机正反转,就是对按键判断部分不对,大神看我这判断条件可不可以这么写
if((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_2 ))==0){m_eight_pos(); //八拍驱动正转360度}
else if((GPIOPinRead(GPIO_PORTB_BASE, GPIO_PIN_3))==0){m_eight_rev(); //八拍驱动反转360度}
Michael Sun:
回复 yan yao:
楼主按键都没去抖动啊,这一按下去都不知道跳哪里去了。
yan yao:
回复 Michael Sun:
h一定得去抖吗?我一直按着也没用,判断条件是对的吧?我试试去抖看看,谢了啊
Michael Sun:
回复 yan yao:
按键都要去抖的。先把这个做了,然后再看你的执行函数的逻辑和预期是否能符合。
是按下执行一次,还是按下一直执行。
yan yao:
回复 Michael Sun:
可以了,这个程序现在能实现,之前不知道为什么,没有加去抖
Michael Sun:
回复 yan yao:
按键都要加去抖的嘛,你量一下按键得波形,按下和抬起的时候,都会高低电平跳好多次,不去抖就全乱了。