切换到宽版
  • 1160阅读
  • 0回复

[AVR]求教:Atmega16 键盘控制步进电机程序运行不对 [复制链接]

上一主题 下一主题
离线tbb1
 

发帖
8
M币
-494
专家
0
粉丝
0
只看楼主 倒序阅读 我要置顶 楼主  发表于: 2018-03-15
大侠们,
兄弟弄一个小程序,用左右两个按键控制步进电机的运转方向或者速度。
在编程时遇到几个问题:
1. 开机后电机顺时针转,按右键(Mw)后逆时针转。但松开右键后,应该是回到顺时针转。然而并没有,仍然在逆时针转。
2.逆时针转的情况下,按下Two开关应该是修改计时器对比值后加快旋转的速度(提高脉冲输出频率),然而没有反应。
程序调试过很多遍,始终没有得到解决。
红色字体是问题所在行。
求教各位了!



#define Me  PINC&0x01  //RA-.PIN是用来读出io口的逻辑电平值。不能对它写操作。
#define Ms  PINC&0x02  
#define Mw  PINC&0x08  //PC3对应电路板上S5,对应RA+
#define Mn  PINC&0x04
#define Two PINC&0x10  //00010000,PC4,1时16X,0时2X
#define Ns  PIND&0x10
#define Sp  PINA&0x02  //00000010,PA1

void Port_Init(void)
{
PORTA = 0xff;  //PA0-RA输入,PA1-DEC输入。RA电机使能、方向、细分,输出给驱动芯片。PORT就跟51的Px口一样,直接读或直接写
DDRA  = 0x1c;/*PA口前两位是AD输入,其余输出,00011100。PA5/6/7位==DRV8825驱动芯片的M0/M1/M2?
?111对应32细分,000对应无细分.DDR寄存器用来控制数据的方向,1为数据出,0为数据入*/
PORTB = 0xff;  //PB口上拉,PB6-16X led。DEC电机使能、方向、细分,输出给驱动芯片。
DDRB  = 0xff;  //全部输出
PORTC=0xff;  //PC口输入上拉,PC4-Speed,16X处
DDRC =0x00;  //PC口全部输入
PORTD = 0x40;  //01000000,PD6-2X LED,USART的发送接收端口分别为PD0和PD1,PD5-RA脉冲输出,PD7-DEC脉冲输出
DDRD = 0xe2;   //11100010定义PD口为输入输出D5-RA脉冲输出,PD7-DEC脉冲输出。PD0为接收端口,置为输入口;PD1为发送端口,置为输出口,PD6-2x,输出
}
////////////////////////////////////
//R.A.跟踪定时器初始化
//////////////////////////////////////
void Timer1_Init(void)
{
TIMSK=TIMSK&0x1c;  //原来c3,是不是应该是0x1c,TC1使能??00011100:TC1使能
TCCR1A=0x40; //0x40  4:0100--比较匹配时OC1A取反,0:和下面的TCCR1B的9组合,0100--CTC模式,OCR1A为计数最大值
TCCR1B=0x09; //0x09  00001001:WGM12=1,CTC模式。CS00=1(无分频)
TCNT1H=0x00; //计时器的底为0      
TCNT1L=0x00;
OCR1AH=0x09; //RA脉冲输出,对应PD5。16细分
OCR1AL=0xbd; //
}

void Motor_Init(void)
{
//DEC禁止,RA正转使能
PORTA=0x8C;  //10001100,PA5-7:100-16细分,000-无细分,111--32细分,PA4--0时使能,PA3--方向,1为朝西转。PA2--reset
}


int main(void)            
{
Port_Init();      //端口初始化
Timer1_Init();
Motor_Init();
sei();            //使能全局中断  
    
    while(1)
    {        
      if((Two)==0)
        {PORTD=0x40;}  //PORTD&0xbf;}  //01000000,PD6-2X led,0时点亮
      else if((Two)!=0)
         {PORTD=0x00;}  //01000000    

    if((Ns)==0)  //N/S在N位置,北半球
      {
       if((Mw)==1)   //设计是没有按键时就执行下面的PA赋值,但是按键后,这个语句就完全没有执行
          {PORTA=0x8C;}  //10001100,没有按键时,默认向西运动
          
       else if((Mw)==0)  
           {
        PORTA=0x84;  //10000100:100-16细分,000-无细分,PA4--使能,PA3--方向(0-反向),PA2--reset.
        if((Two)!=0)   //这个判别语句没起作用
               {
                 OCR1AH=0xd8; //一倍速06//二倍速03//八倍速00,加上之前的16细分2倍,实际是4倍速    //按下Me后到了这里?
                 OCR1AL=0x00; //一倍速ba//二倍速60//八倍速d8
               }
              else
               {
                 OCR1AH=0x0a; //无细分    /一倍速06//二倍速03//八倍速00,加上之前的16细分2倍,实际是16倍速
                 OCR1AL=0xcc; //一倍速ba//二倍速60//八倍速d8
               }    
           } // if Mw=0 结束
        
         }  //Ns=0 if 循环

    }  //while循环
} //main循环
快速回复
限80 字节
如果您提交过一次失败了,可以用”恢复数据”来恢复帖子内容
 
上一个 下一个