历史上的今天
返回首页

历史上的今天

今天是:2024年11月09日(星期六)

正在发生

2019年11月09日 | AVR stdio写的ATMEGA16控制步进电机正反转和速度

2019-11-09 来源:51hei

AVR stdio写的ATMEGA16控制步进电机正反转和速度,供大家免费参阅和批评

适合初学者,总共七个按键  三个按键控制三个速度正转,三个按键控制三个速度反转,一个按键控制停止。

本程序控制步进电机是和步进电机驱动器相连接的,所以脉冲只有一路,如果想直接连步进电机只需要稍加改动即可。

 

主程序预览:

#define F_CPU 800000UL

#include

#include

#define INT8U unsigned int

#define INT16U unsigned int


const INT8U FFW[]={0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00,0x01,0x00};//一拍p0口输出8个脉冲


//按键定义

#define K1_DOWN()((PIND &_BV(PD0)) == 0x00)//K1:正转速度1

#define K2_DOWN()((PIND &_BV(PD1)) == 0x00)//K2:正转速度2

#define K3_DOWN()((PIND &_BV(PD2)) == 0x00)//K3:正转速度3

#define K4_DOWN()((PIND &_BV(PD3)) == 0x00)//K4:停止

#define K5_DOWN()((PIND &_BV(PD4)) == 0x00)//K5:反转速度1

#define K6_DOWN()((PIND &_BV(PD5)) == 0x00)//K6:反转速度2

#define K7_DOWN()((PIND &_BV(PD6)) == 0x00)//K7:反转速度3


void STEP_MOTOR_FWRUN_1(INT8U n)

{

   INT8U i,j;

   

   for(i=0;i   {

     for(j=0;j<16;j++)//循环输出16*8拍

     { 

        //if (K1_DOWN())break;

                 if (K2_DOWN())break;

                 if (K3_DOWN())break;

       if (K4_DOWN())return;//中途按下K4时电机停止转动

          

             if (K5_DOWN())break;

                 if (K6_DOWN())break;

                 if (K7_DOWN())break;

          PORTB=FFW[j];

          _delay_us(50);


}

PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点

}

}


void STEP_MOTOR_FWRUN_2(INT8U n)

{

   INT8U i,j;

   

   for(i=0;i   {

     for(j=0;j<16;j++)

     { 

       if (K1_DOWN())break;

                // if (K2_DOWN())break;

                 if (K3_DOWN())break;

       if (K4_DOWN())return;//中途按下K4时电机停止转动


             if (K5_DOWN())break;

                 if (K6_DOWN())break;

                 if (K7_DOWN())break;

          PORTB=FFW[j];

          _delay_us(150);


}

PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点

}

}


void STEP_MOTOR_FWRUN_3(INT8U n)

{

   INT8U i,j;

   

   for(i=0;i   {

     for(j=0;j<16;j++)

     { 

       if (K1_DOWN())break;

                 if (K2_DOWN())break;

                // if (K3_DOWN())break;

       if (K4_DOWN())return;//中途按下K4时电机停止转动

           

             if (K5_DOWN())break;

                 if (K6_DOWN())break;

                 if (K7_DOWN())break;

          PORTB=FFW[j];

          _delay_us(300);


}

PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点

}

}



void STEP_MOTOR_CWRUN_5(INT8U n)

{

   INT8U i,j;

   

   for(i=0;i   {

     for(j=0;j<16;j++)

     { 

      if (K1_DOWN())break;

                 if (K2_DOWN())break;

                 if (K3_DOWN())break;

       if (K4_DOWN())return;//中途按下K4时电机停止转动

           

            // if (K5_DOWN())break;

                 if (K6_DOWN())break;

                 if (K7_DOWN())break;

           

           PORTB=FFW[j];

          _delay_us(300);


}

PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点

}

}


void STEP_MOTOR_CWRUN_6(INT8U n)

{

   INT8U i,j;

   

   for(i=0;i   {

     for(j=0;j<16;j++)

     { 

        if (K1_DOWN())break;

                 if (K2_DOWN())break;

                 if (K3_DOWN())break;

       if (K4_DOWN())return;//中途按下K4时电机停止转动

         

             if (K5_DOWN())break;

                 //if (K6_DOWN())break;

                 if (K7_DOWN())break;

           

           PORTB=FFW[j];//方向为0时正转

          _delay_us(150);


}

PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点

}

}


void STEP_MOTOR_CWRUN_7(INT8U n)

{

   INT8U i,j;

   

   for(i=0;i   {

     for(j=0;j<16;j++)

     {   if (K1_DOWN())break;

                 if (K2_DOWN())break;

                 if (K3_DOWN())break;

       if (K4_DOWN())return;//中途按下K4时电机停止转动

        

             if (K5_DOWN())break;

                 if (K6_DOWN())break;

                // if (K7_DOWN())break;

           PORTB=FFW[j];

          _delay_us(50);


}

PORTB=0x01;//最后一圈之后输出0x01这一拍电机回到起点

}

}

void beep()

{

        PORTC=0x40;

        _delay_ms(120);

        PORTC=0X00;

}


void initonbeep()

{

PORTC=0x40;

_delay_ms(120);

PORTC=0X00;

_delay_ms(120);

PORTC=0x40;

_delay_ms(120);

PORTC=0X00;

_delay_ms(120);

PORTC=0x40;

_delay_ms(120);

PORTC=0X00;

_delay_ms(120);

PORTC=0x40;

_delay_ms(120);

PORTC=0X00;

}



int main()

{

   INT8U r=65535;

   DDRB=0xFF;PORTB=FFW[0];   //控 制输出

   DDRD=0X00;PORTD=0xFF;     //按键输入

   DDRA=0X00;PORTA=0xFF; //方向信号

   DDRC=0XFF;PORTC=0x00; //蜂鸣器

   initonbeep ();

  

   while(1)

   {

    


     if(K1_DOWN())

     {

                  _delay_us(200);

                  if(K1_DOWN())

     {

                 beep();

         //while(K1_DOWN());   //等待 K1 释放

                 PORTA=0x00;        //方向信号为0

         STEP_MOTOR_FWRUN_1(r);//点击正转r圈

                 

      }

         }          

          if(K2_DOWN())

     {

                   _delay_us(200);

                  if(K2_DOWN())

     {

                 beep();

         //while(K1_DOWN());   //等待 K1 释放

                 PORTA=0x00;        //方向信号为0

         STEP_MOTOR_FWRUN_2(r);//点击正转r圈

      }

         }          

          if(K3_DOWN())

     {

                   _delay_us(200);

                  if(K3_DOWN())

     {

                 beep();

         //while(K1_DOWN());   //等待 K1 释放

                 PORTA=0x00;        //方向信号为0

         STEP_MOTOR_FWRUN_3(r);//点击正转r圈

      }

         }          

      if(K5_DOWN())

      {

                    _delay_us(200);

                  if(K5_DOWN())

     {

                 beep();

         //while(K2_DOWN());    //等待K2释放

         PORTA=0x01;         //方向信号为1

         STEP_MOTOR_CWRUN_5(r); //电机反转r圈

       }

          }           

         if(K6_DOWN())

      {

                    _delay_us(200);

                  if(K6_DOWN())

     {

                 beep();

         //while(K2_DOWN());    //等待K2释放

         PORTA=0x01;         //方向信号为1

         STEP_MOTOR_CWRUN_6(r); //电机反转r圈

       }

          }           

推荐阅读

史海拾趣

ACP Optoelectronic Technology Co Ltd公司的发展小趣事

为了进一步提升技术实力和市场份额,ACP Optoelectronic Technology Co Ltd积极寻求与其他企业的战略合作。公司先后与多家知名电子企业签订了技术合作协议,共同开发新产品,共享市场资源。这些合作不仅提升了ACP Optoelectronic Technology Co Ltd的技术水平,也为其带来了更多的商业机会,推动了公司的快速发展。

Forge Europa Ltd公司的发展小趣事

Forge Europa Ltd公司深知可持续发展对于企业和行业的重要性。因此,公司在生产过程中始终坚持绿色、环保的理念,致力于减少能源消耗和环境污染。公司采用了先进的生产技术和设备,提高了生产效率和资源利用率,同时加强了废弃物的处理和回收工作。此外,Forge Europa还积极参与各类环保活动,倡导绿色消费和低碳生活,为行业树立了可持续发展的典范。

Herth+Buss Fahrzeugteile GmbH & Co KG公司的发展小趣事
定期检查传感器和电路的连接情况,确保无松动或损坏。
Amidon Associates Inc公司的发展小趣事
能有效区分人体与其他物体的红外线辐射,减少误报。
Electrocube Inc公司的发展小趣事

作为一家有社会责任感的企业,Electrocube Inc公司始终关注环保问题。公司积极采用环保材料和生产工艺,减少生产过程中的污染排放。同时,公司还积极参与环保公益活动,推动电子行业的绿色发展。这种对环保的关注和践行,使得Electrocube Inc公司在业界树立了良好的形象。

Avasem公司的发展小趣事

随着全球对环境保护和可持续发展的关注度不断提升,Avasem公司积极响应这一趋势,将可持续发展理念融入公司的战略规划和日常运营中。公司采用环保材料和工艺生产电子产品,降低生产过程中的能源消耗和废弃物排放。同时,Avasem公司还积极参与社会公益事业,支持教育、环保等领域的项目。这些举措不仅提升了公司的社会形象,还为其赢得了更多消费者的支持和信任。

请注意,以上故事均为虚构内容,旨在展示一个电子行业公司可能的发展路径和策略。在实际情况下,一个公司的成长会受到多种因素的影响,包括市场环境、技术发展趋势、公司战略选择等。因此,这些故事并不能完全代表任何真实存在的电子行业公司的发展历程。

问答坊 | AI 解惑

用C51编写的MAX7219的问题

我用MAX7219 驱动LED 显示时间倒计时  用8051 可驱动不能用   看看这段程序有问题没有void max7219_reset(void)                //初始化MAX7219 {    writ ...…

查看全部问答>

2812最小系统板

经过几天不懈的努力终于吧2812的最小系统板画完,弄上来让大家给提点建议~!! 希望大家多多指教原理图 PCB…

查看全部问答>

基于LABVIEW和单片机的激光器温度控制系统的研究

基于LABVIEW和单片机的激光器温度控制系统的研究…

查看全部问答>

端午节到了,本周工作7天,问题来了

1. 本周工作7天,意味我星期六我又不来带我小孩去上课,如果去,又需要请假,不去,对不起小朋友。据说小孩3岁前培养是很重要的。 2。连续工作7天,好累人的,那么不知道,端午节公司发过节费不?等待求证 3。最重要的问题,端午节来了,EEWORLD ...…

查看全部问答>

电源用烤箱做高温实验

我现在调试高温,都是拿个烤箱,内置一个温度计;手动调温70度;当温度过高时,停止 加热,让温度保持于实验温度;唯一不好的一点就是有时候温度不够精确,实验人员得长 时间呆在旁边; 有时候不经意间就把温度得加过了,真汗~ 垂诞一个高温箱~ ...…

查看全部问答>

电源的设计

1 电子产品,特别是军用电源的设计是一个系统工程,不但要考虑电源本身参数设计,还要考虑电气设计、电磁兼容设计、热设计、安全性设计、三防设计等方面。因为任何方面那怕是最微小的疏忽,都可能导致整个电源的崩溃,所以我们应充分认识到电源产品 ...…

查看全部问答>

怎样将2440开发板里的文件共享到PC机上

各位大虾,我现在想将2440开发板上的文件通过网线共享到PC机上,不知道要怎么操作,希望大家帮帮忙啊 特别感谢,非常感谢!…

查看全部问答>

请各位帮忙解释一下这个电阻的作用

    请问上图电阻R15在以上开关电路的作用是什么? 不会是反馈吧? 有劳各位帮忙解释一下…

查看全部问答>

pc与单片机通讯

我做了一个单片机与计算机通讯的系统,是通过在在Delphi里面嵌入汇编语言做的.这个系统在98下能运行,可在XP下不能运行,应该如何解决呢?谢谢…

查看全部问答>

应用程序如何读出SD卡里面一个较大文件

这个问题比较可笑吧。 可是我就是搞不定, 现在网上down下了一个例子程序,是读出SD卡的一个test.txt文件。 BOOL CSDMMCDlg::OnInitDialog() {         CDialog::OnInitDialog();         // Set the i ...…

查看全部问答>