新闻中心

EEPW首页>嵌入式系统>设计应用> 基于Mega128编码器控制步进电机的平衡系统

基于Mega128编码器控制步进电机的平衡系统

作者: 时间:2016-11-29 来源:网络 收藏
====================================================================这里是dianji.c====================================================================#include"dianji.h"#include"delay.h"#include /*步进电机旋转一周子函数*/void one_circle(void){unsigned int i;for(i=0;i<3200;i++){EN_1;delay_us(100);EN_0;delay_us(100);}}/*步进电机根据编码器计算的数值旋转任意角度子函数*/void circle(unsigned int xcircle){unsigned int i,j;for(j=0;j #include #include //一些变量的定义int k=0;unsigned int x=1,d=0,c=0,cir=0;unsigned int a,aa,q,angle=0,p=0;//595(数码管)显示数组unsigned char led[]={0x3F, // 00x06, // 10x5B, // 20x4F, // 30x66, // 40x6D, // 50x7D, // 60x07, // 70x7F, // 80x6F, // 9};//外部中断0~3向量号码#pragma interrupt_handler Zhongduan_0:2#pragma interrupt_handler Zhongduan_1:3#pragma interrupt_handler Zhongduan_2:4//端口输入输出初始化void init_xianshi(void){DDRA=0XFF;DDRB=0XFF;//595控制口DDRC=0XFF;//正反转提示LEDPORTC=0XFF;//LED初始化(暗)}//595串入一字节并处发送一字节子函数void send_595(unsigned char dat){unsigned char i;LCK_0;SDI_1;SCK_0;//上面的三条语句为了初始化端口状态for(i=0;i<8;i++){LCK_0;//时钟线拉低if(dat&0x80)SDI_1;else SDI_0;dat=dat<<1;delay_us(100); LCK_1; //时钟线拉高将数据读入595的移位寄存器 delay_us(100); }SCK_1; //发送数据到并行端口SCK_0; }void jiaoduzhuanhuan(void){init_xianshi();EIMSK=0X0F;EICRA=0XAA; while(1){ if(a!=aa) /*如果有角度变化就执行下面的程序*/{angle++;if(!(PING&0X04))cir++; while(cir){if(!k){delay_ms(800);if(d<=3)one_circle();d++;}} if(!(PING&0X02)){while(PING&0X01){DIR_0;circle(1);p++;while(p==angle);}while(PING&0X01);if(q=-1)//正转DIR_1;circle(1);if(q==1) //反转DIR_1;}aa=a;if(!x){PORTC=0X00;}}/*下面为数码管显示编码器当前计数的数值*/PORTA=0X08; send_595(0x00);send_595(led[abs(k)%10]);PORTA=0X01; send_595(0x00);send_595(led[(abs(k)%100)/10]);PORTA=0X02; send_595(0x00);send_595(led[(abs(k)%1000)/100]);PORTA=0X04; send_595(0x00);send_595(led[abs(k)/1000]);SEI(); /*使能中断*/} }void Zhongduan_0(void){CLI();x=0;////////////////// if(PIND&0X02)q=-1;if(!(PIND&0X02))q=1;////////////////k=k+q;SEI();}void Zhongduan_1(void){CLI();if(PIND&0X01)q=1;k=k+q;if(abs(k)==10000){k=0;}a=k;//EIMSK=0X0E;SEI();}void Zhongduan_2(void){CLI();k=0;SEI();}====================================================================这里是main.c====================================================================#include #include #include"delay.h"#include"caiji.h"#include"dianji.h"void init(void){DDRC=0X03;PORTC=0X00;}void main(void){init(); //初始化子函数jiaoduzhuanhuan(); //主程序的实现}====================================================================
上一页 1 2 下一页

评论


技术专区

关闭