AVR stdio写的ATMEGA16控制步进电机正反转和速度

2019-11-09来源: 51hei关键字:AVR  stdio  ATMEGA16  控制步进电机  正反转  速度

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] [2]
关键字:AVR  stdio  ATMEGA16  控制步进电机  正反转  速度 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic479507.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:mega128波形发生器仿真及源程序 LCD显示
下一篇:基于ATmega128单片机的红外控制电机系统源码

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR PCF8591 AD&DA数码管显示
#include "iom16v.h"#include "macros.h"#define uchar unsigned char#define uint unsigned int/*******************************************TWSR中数据的各种状态,#include"iom16v.h"#include "macros.h"#define uchar unsigned char#define uint unsigned int/*******************************************
发表于 2019-11-11
AVR单片机红外遥控键值解码实验
AVR学习笔记十八、红外遥控键值解码实验  18.1 实例功能 红外线遥控是目前使用最广泛的一种通信和遥控手段。由于红外线遥控装置具有体积小、功耗低、功能强、成本低等特点,因而,继彩电、录像机之后,在录音机、音响设备、空凋机以及玩具等其它小型电器装置上也纷纷采用红外线遥控。工业设备中,在高压、辐射、有毒气体、粉尘等环境下,采用红外线遥控不仅完全可靠而且能有效地隔离电气干扰。 在这个实验中,我们采用红外线遥控器和一体化红外接收头来进行红外遥控键值解码的实验,本实例分为三个功能模块,分别描述如下: ● 单片机系统:利用 ATmega16单片机与一体化红外接收器组成红外接收电路。 
发表于 2019-11-11
AVR单片机红外遥控键值解码实验
AVR单片机跑马灯的仿真设计
简易的跑马灯设计。基于AVR单片机仿真原理图如下:单片机源程序如下:/********************************************************************                            汇诚科技*********************************************************************/#include <iom16v.h>
发表于 2019-11-11
AVR单片机跑马灯的仿真设计
AVR Studio 的使用注意
AVR单片机最常用的集成开发环境就是AVR Studio和ICCAVR了,AVR Studio是ATMEL公司自己开发的编译环境,但是只支持汇编语言的开发。现在的版本已经出到AVR Studio5.0 ,但是好像要100M左右,很多研发的都是在使用AVR Studio4.0版本的吧。相对于C语言来说,就要安装winAVR和AVR Studio共同组成C语言编译环境了。AVR Studio头文件有自己的延迟函数。#include <uitl/delay.h>有毫秒_delay_ms()和微妙_delay_us()两个子函数,可以在其他函数中调用这两个函数,但是使用这两个函数的时候特别要注意在AVR Studio中设置编译
发表于 2019-11-11
关于AVR单片机,你了解多少?
什么是AVR单片机?AVR单片机有什么优点?为什么要选择AVR单片机?AVR单片机是ATMEL公司研制开发的一种新型单片机,它与51单片机、PIC单片机相比具有一系列的优点:1:在相同的系统时钟下AVR运行速度最快;2: 芯片内部的Flsah、EEPROM、SRAM容量较大;3:所有型号的Flash、EEPROM都可以反复烧写、全部支持在线编程烧写(ISP);4:多种频率的内部RC振荡器、上电自动复位、看门狗、启动延时等功能,零外围电路也可以工作;5:每个IO口都可以以推换驱动的方式输出高、低电平,驱动能力强;6:内部资源丰富,一般都集成AD、DA模数器;PWM;SPI、USART、TWI、I2C通信口;丰富的中断源等。目前支持
发表于 2019-11-09
AVR单片机经典使用经验
AVR具有上手入门快,开发方便简单的特点,但要充分体会和发挥AVR的优点,还需要应用工程师本身的硬软件设计开发能力的不断学习、实践提高。AVR与传统类型的单片机相比,除了必须能实现原来的一些基本的功能,其在结构体系、功能部件、性能和可靠性等多方面有很大的提高和改善。功能越好的器件,需要具备更高技术和能力的人来使用和驾驭它。就象一部好的F1赛车,只有具备高超技术的驾驶员才能充分体会到车的特点,并能最大限度的发挥出车的性能。“外行看热闹,内行看门道”,对于有一定基础的嵌入式和单片机系统设计开发的工程师,不妨先简单尝试一下AVR。开发环境与工具:PC+下载线+实际的系统板PC上的开发软件:AVR Studio(Free)汇编+汇编调试
发表于 2019-11-09
AVR单片机经典使用经验
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved