11638|5

78

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

AVR ATMega16 步进电机驱动程序,已经调试通过【转】 [复制链接]

这两天做步进电机的驱动成功,现将程序共享,愿起到抛砖引玉的作用。
此程序可驱动五引线步进电机,通过按键可控制步进电机的转速、方向、三种驱动方式,三种驱动方式分别为:单四拍驱动、双四拍驱动、单双八拍驱动,其中以单双八拍驱动转速最慢。具体联接方式在程序中有说明。
/************************************
*        步进电机的M16驱动程序        *
* 功   能:用M16驱动步进电机        *
*            实现三种驱动方式        *
*            单四拍驱动、双四拍驱动    *
*            单双八拍驱动            *
* 驱动芯片:ULN2803                    *
* 联接方式:PC0-3分别通过2803接A-D    *
*            步进电机公共端接+5V电源    *
* 建立日期:2008年04月05日            *
* 作   者:铜河                    *
* 版   本:V1.0                    *
* 修改日期:2008年04月06日            *
* 主控芯片:M16                        *
* 时钟频率:外部晶体 7.3728MHZ        *
* 编 译 器:ICCAVR 6.31A            *
************************************/
#include
#include
#include "delay.h"

#define RD_KEY() ((~(PINC|0x0F))>>4)//四按键接于PC4-PC7

unsigned char i=0;            //转动计数
unsigned char m=1;            //驱动方式参数
unsigned char n=0;            //转动方向参数
unsigned int zhuansu=61500;    //转速数据

/****************************
*        端口配置函数        *
****************************/
void port_init(void)
   {
   PORTA = 0x40;
   DDRA = 0x40;
   PORTB = 0x00;
   DDRB = 0x00;
   PORTC = 0xF0;
   DDRC = 0x0F;
   PORTD = 0x00;
   DDRD = 0x00;
   }

/****************************
*        正转操作函数        *
* 入   口:a 三种工作方式    *
****************************/
void bj_fs(unsigned char a)
   {
   switch(a)
       {
       case 1:                //单四拍方式驱动
           PORTC |= 1<            i++;
           if(i>=4)i=0;
           break;
       case 2:                //双四拍方式驱动
           if(i!=4)        //AB、BC、CD、DA驱动
               PORTC |= (1<            else
               PORTC |= (1<<(i-1))|1;
           i++;
           if(i>=5)i=1;
           break;
       case 3:                //单双八拍方式驱动
           if(i%2)            //A、AB、B、BC、C、CD、D、DA驱动
               {
               if(i!=7)
                   PORTC |= (1<<(i/2))|(1<<(i/2+1));
               else
                   PORTC |= (1<<(i/2))|1;
               }
           else
               {
               PORTC |= 1<<(i/2);
               }
           i++;
           if(i>=8)i=0;
           break;
       default:break;
       }
   }

/****************************
*        反转操作函数        *
* 入   口:a 三种工作方式    *
****************************/
void bj_fsf(unsigned char a)
   {
   switch(a)
       {
       case 1:                    //单四拍方式驱动
           PORTC |= 1<<(3-i);    //D、C、B、A驱动
           i++;
           if(i>=4)i=0;
           break;
       case 2:                    //双四拍方式驱动
           if(i!=4)            //AD、CD、BC、AB驱动
               PORTC |= (1<<(3-i))|(1<<(4-i));
           else
               PORTC |= (1<<(i-1))|1;
           i++;
           if(i>=5)i=1;
           break;
       case 3:                    //单双八拍方式驱动
           if(i%2)                //DA、D、CD、C、BC、B、AB、A驱动
               {
               PORTC |= 1<<(3-i/2);
               }
           else
               {
               if(i)
                   PORTC |= (1<<(3-i/2))|(1<<(4-i/2));
               else
                   PORTC |= (1<<(3-i/2))|1;
               }
           i++;
           if(i>=8)i=0;
           break;
       case 4:
      
       default:break;
       }
   }

/****************************
*        定时器1配置函数        *
* 工作模式:普通模式        *
* 工作方式:溢出中断        *
* 预 分 频:64                *
* 时钟频率:外部7.3728MHZ    *
****************************/
void timer1_init(void)
   {
   TCCR1B = 0x00;
   TCNT1H = zhuansu>>8;
   TCNT1L = zhuansu&0xFF;
   TCCR1A = 0x00;
   TCCR1B = 0x02;
   }
/****************************
*        定时器1中断函数        *
****************************/
#pragma interrupt_handler timer1_ovf_isr:9
void timer1_ovf_isr(void)
   {
   TCNT1H = zhuansu>>8;
   TCNT1L = zhuansu&0xFF;
   PORTC &= 0xF0;
   if(n)
       bj_fsf(m);            //反转
   else
       bj_fs(m);            //正转
   }

/****************************
*        器件初始化函数        *
****************************/
void init_devices(void)
   {
   CLI();
   port_init();
   timer1_init();

   MCUCR = 0x00;
   GICR = 0x00;
   TIMSK = 0x04;
   SEI();
   }

/****************************
*            主函数            *
****************************/
void main(void)
   {
   unsigned char key,key1;
   init_devices();
   
   while(1)
       {
       key=RD_KEY();        //按键扫描
       if(key)
           {
           delay_ms(20);
           key1=RD_KEY();
           if(key==key1)
               {
               switch(key)        //按键有效,相应处理
                   {
                   case 0x01:    //S1键处理:转速增加
                       zhuansu += 100;
                       if(zhuansu>62000)zhuansu=62000;
                       break;
                   case 0x02:    //S2键处理:转速降低
                       zhuansu -= 100;
                       if(zhuansu<5000)zhuansu=5000;
                       break;
                   case 0x04:    //S3键处理:转换驱动方式
                       m++;
                       if(m>=4)m=1;
                       break;
                   case 0x08:    //S4键处理:正反转控制
                       if(n)
                           n=0;
                       else
                           n=1;
                       break;
                   default:break;
                   }
               }
           while(key)            //等待按键释放
               {
               delay_ms(10);
               key=RD_KEY();
               }
           }
       }
   }
此帖出自工控电子论坛

最新回复

楼主没写延时程序?  详情 回复 发表于 2013-5-30 03:33
点赞 关注
 

回复
举报

24

帖子

0

TA的资源

纯净的硅(高级)

沙发
 
谢谢,以后会用得着
此帖出自工控电子论坛
 
 

回复

19

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
学习了,,,感谢分享...
此帖出自工控电子论坛
 
 

回复

1290

帖子

0

TA的资源

五彩晶圆(初级)

4
 
先收藏着,估计能用得上的
此帖出自工控电子论坛
 
 

回复

29

帖子

0

TA的资源

一粒金砂(高级)

5
 
谢谢分享,我正在学习
此帖出自工控电子论坛
 
 

回复

1

帖子

0

TA的资源

一粒金砂(初级)

6
 

楼主没有写延时程序???

楼主没写延时程序?
此帖出自工控电子论坛
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表