| 查看: 419 | 回复: 2 | |||
[交流]
基于THB6128和ATMEGA8单片机的步进电机驱动程序设计
|
|||
|
/********************************************************************* 程 序:DDC程序 版 本: DDCdio_VER1.1 修改日期:2008.1.15 **********************************************************************/ #include <main.h> #include "INCLUDES.h" //*********************************************************************** //定义指针 * //************************************************************************/ /********************************************************* *函数:void wait(unsigned int n) *功能:延时子程序 **********************************************************/ void wait(unsigned int n){ //ok unsigned int i; for(i=0;i<n;i++); } /********************************************************* *函数:void Data_ASC(unsigned char num ) *功能:数字转换为ASC码 **********************************************************/ void Data_ASCII(unsigned char num,unsigned char * buf ) { unsigned char a; a=(num>>4)&0x0f; if(a>9) buf[0]=a+0x37; else buf[0]=a+0x30; a=num&0x0f; if(a>9) buf[1]=a+0x37; else buf[1]=a+0x30; } /********************************************************* *函数:unsigned char ASC_Data(unsigned char asch,unsigned char ascl ) *功能:ASC码转换为数字 **********************************************************/ unsigned char ASCII_Data(unsigned char* buf ) { unsigned char a,b; a=buf[0]-0x30; if(a>9) a=a-0x07; b=buf[1]-0x30; if(b>9) b=b-0x07; a=(a<<4)|b; return (a); } /********************************************************* *函数:void EEPROM_Data_Init() *功能:EEPROM子程序 **********************************************************/ unsigned char XOR(unsigned char* buf,unsigned char Len) { unsigned char a,i; a=0; for(i=1;i<Len;i++) { a=a^buf; } return a; } /************************************************************************ *函数原型: __interrupt void USART0_isr(void) * *参数说明: 外部中断1 * ************************************************************************/ #pragma vector=USART_RXC_vect __interrupt void USART_isr(void) { //__disable_interrupt();//disable all interrupts unsigned char a; a=UDR; if(a==0x40)UART_offset=0; RX_buf[UART_offset]=a; UART_offset++; if(UART_offset==11)UART_message=1; //__enable_interrupt(); //re-enable interrupts } /************************************************************************ *函数原型: void timer1_init(); * *参数说明: timer1初始化 计数 * ************************************************************************/ #pragma vector=TIMER0_OVF_vect __interrupt void timer0_ovf_isr(void) { } /************************************************************************ *函数原型: void timer1_ovf_isr(void); * *参数说明: timer1中断 * ***********************************************************************/ #pragma vector=TIMER1_OVF_vect __interrupt void timer1_ovf_isr(void) { //TIMER1 has overflowed TCNT1H = 0xE6; //reload counter high value TCNT1L = 0x23; //reload counter low value s_count++; if(LED_flag==0) { LED_L; LED_flag=1; } else { LED_H; LED_flag=0; } } /************************************************************************ *函数原型: void timer1_ovf_isr(void); * *参数说明: timer1中断 ***********************************************************************/ void Dot_down( ) { DJ_FRE_H; /*6128使能*/ DJ_UD_L; /*正转*/ while((PIND&0x04)!=0x00) /*产生clk,先加速,后匀速*/ { DJ_CP_L; wait(1); DJ_CP_H; wait(1); } DJ_CP_L; } /************************************************************************ *函数原型: void timer1_ovf_isr(void); * *参数说明: timer1中断 ***********************************************************************/ void step_down(unsigned int n) { unsigned int i,j; DJ_FRE_H; /*6128使能*/ DJ_UD_L; /*正转*/ for(i=0;i<n;i++) /*产生clk,先加速,后匀速*/ { for(j=0;j<25600;j++) /*产生clk,先加速,后匀速*/ { if((PIND&0x04)==0x00)return; DJ_CP_L; wait(1); DJ_CP_H; wait(1); } } DJ_CP_L; } /*反转*/ void step_up(unsigned int n) { unsigned int i,j; DJ_FRE_H; /*6128使能*/ DJ_UD_H; /*正转*/ for(i=0;i<n;i++) /*产生clk,先加速,后匀速*/ { for(j=0;j<25600;j++) /*产生clk,先加速,后匀速*/ { if((PIND&0x04)==0x00)return; DJ_CP_L; wait(1); DJ_CP_H; wait(1); } } DJ_CP_L; } /************************************************************************ *函数原型: void timer1_ovf_isr(void); * *参数说明: timer1中断 * ***********************************************************************/ void adc_init(void) { DDRC&=0xfe; PORTC&=0xfe; ADCSR =0x00; //disable adc ADMUX = 0x40; //select adc input 0 ACSR = 0x80; //禁止模拟比较器 ADCSR = 0x86; } /************************************************************************ *函数原型: void timer1_ovf_isr(void); * *参数说明: timer1中断 * ***********************************************************************/ unsigned char adc_IN0(void) { unsigned char b; unsigned int a,i,temp[10];// unsigned long l; for(i=0;i<10;i++) { ADMUX = 0x40; ADCSR |= 0xc0; wait(100); temp=ADC; } l=0; for(i=0;i<10;i++) { l=l+temp;//ADC_buf } a=(unsigned int)(l/10); b=(unsigned char)(a>>2); return b; } /********************************************************* *函数:void EEPROM_Data_Init() *功能:EEPROM子程序 **********************************************************/ void Ret_Data() { unsigned char a,temp[11],H[2]; temp[0]=0x40; Data_ASCII(Mode_ID,H); temp[1]=H[0]; temp[2]=H[1]; Data_ASCII(4,H); temp[3]=H[0]; temp[4]=H[1]; Data_ASCII(ADC_Data,H); temp[5]=H[0]; temp[6]=H[1]; Data_ASCII(Dot_flag,H); temp[7]=H[0]; temp[8]=H[1]; a=XOR(temp,9); Data_ASCII(a,H); temp[9]=H[0]; temp[10]=H[1];/**/ Send_UART(temp,11); //Send_UART(RX_buf,11); } /********************************************************* *函数:void EEPROM_Data_Init() *功能:EEPROM子程序 **********************************************************/ void UART_Msg(unsigned char* buf) { unsigned char a,b; unsigned char i,j; unsigned char H[2],temp[15]; H[0]=buf[1]; H[1]=buf[2]; b=ASCII_Data(H); if(b!=Mode_ID) { if(b!=0x00) return; } H[0]=buf[9]; H[1]=buf[10]; b=ASCII_Data(H); a=XOR(buf,9); if ( a != b ) return;// 校验正确 j=1; for(i=0;i<4;i++) { H[0]=buf[j]; j++; H[1]=buf[j]; j++; temp=ASCII_Data(H); } //Send_UART(RX_buf,11); switch(temp[1]) { case 0: { Dot_down( ); break; } case 1: { woke_flag=1; step_count=temp[2]; cycle_count=temp[3]; break; } case 2: { woke_flag=2; step_count=temp[2]; break; } case 3: { woke_flag=3; //Send_UART(RX_buf,11); break; } } } /********************************************************* *函数:void Send_com(unsigned char add,unsigned char com,unsigned char Dat,unsigned char flag) *功能:发送命令子程序 **********************************************************/ void Send_com(unsigned char add,unsigned char com,unsigned char Dat,unsigned char flag) { unsigned char a,temp[15],H[2]; temp[0]=0x40; Data_ASCII(add,H); temp[1]=H[0]; temp[2]=H[1]; Data_ASCII(com,H); temp[3]=H[0]; temp[4]=H[1]; Data_ASCII(Dat,H); temp[5]=H[0]; temp[6]=H[1]; Data_ASCII(flag,H); temp[7]=H[0]; temp[8]=H[1]; a=XOR(temp,9); Data_ASCII(a,H); temp[9]=H[0]; temp[10]=H[1]; Send_UART(temp,11); } /************************************************************************ *函数原型: void main(void); * *参数说明: 主函数 * 协议:0x40 地址(2)命令(2) 数据(2) 数据(2) 校验(2) 命令: 0: 回位 1:按摩上行 数据1=高度 数据2=重复次数 2:翻身上行 3: 读数据 4: 返回数据 ************************************************************************/ void main(void) { unsigned int i;//a, wait(6000); init_devices(); uart_init(4800); s_count=0; EN485_L; mS=0; way_flag=0; Mode_ID=(~PINB)&0x1f; for(i=0;i<Mode_ID;i++)wait(10000); if((PIND&0x04)!=0x00)Dot_down( ); //Send_UART(RX_buf,9); while(1) { /* Send_com(0,1,20,0); for(i=0;i<200;i++)wait(60000); Send_com(0,2,20,1); for(i=0;i<200;i++)wait(60000); */ if((PIND&0x04)!=0x00) Dot_flag=0; else Dot_flag=1; if((PIND&0x08)==0x00)step_up(1); if(UART_message==1) { //__disable_interrupt(); UART_Msg(RX_buf); //Send_UART(RX_buf,11); UART_message=0; //__enable_interrupt(); } if(woke_flag==1) { if(cycle_count!=0) { step_up(step_count); Dot_down( ); cycle_count--; } if(cycle_count==0)woke_flag=0; } if(woke_flag==2) { step_down(step_count); woke_flag=0; } if(woke_flag==3) { Ret_Data(); woke_flag=0; } ADC_Data=adc_IN0(); // Send_Data(ADC_Data); } } |
» 本帖附件资源列表
-
欢迎监督和反馈:小木虫仅提供交流平台,不对该内容负责。
本内容由用户自主发布,如果其内容涉及到知识产权问题,其责任在于用户本人,如对版权有异议,请联系邮箱:xiaomuchong@tal.com - 附件 1 : 新建文本文档_(2).txt
2013-08-31 09:29:07, 10.31 K
» 猜你喜欢
290求调剂
已经有9人回复
0856化工专硕求调剂
已经有6人回复
0856材料专业298分有科研经历 硕士研究生调剂自荐信
已经有6人回复
材料化工调剂
已经有7人回复
化工299分求调剂 一志愿985落榜
已经有3人回复
306分材料调剂
已经有4人回复
302材料工程求调剂
已经有5人回复
272求调剂
已经有5人回复
材料学调剂
已经有9人回复
321求调剂一志愿东北林业大学材料与化工英二数二
已经有6人回复
» 抢金币啦!回帖就可以得到:
曲阜师范大学刘中秋团队招化学、材料科学与工程专业调剂生
+1/96
青岛科技大学JIEQING团队招收材料科学、化学化工相关领域的硕/博研究生数名
+1/89
北京石油化工学院新材料与化工学院接收调剂
+2/88
设备故障诊断与预测性维护方向-硕博研究生兼职
+1/37
哈尔滨工业大学博士招生
+1/34
澳门理工大学人工智能智慧康养2026 年9月入学 博士招生有奖学金
+1/27
南京林业大学化工院勇强/赖晨欢教授团队招收申请考核制博士1名
+1/26
算法实习生招聘(驻地郑州,可提供实习证明、转正机会)
+1/20
吉林大学张越涛教授团队长期招收博士后、2026年入学博士研究生和科研助理
+1/17
【青岛大学】2026年生物与医药申请考核制博士生招生(含少数民族骨干人才)
+1/12
26届计算机、电子信息类、电科、控制、通信考研T j信息pp骏:74+08+76+6+20
+1/11
中国科学院国家级人才团队博士后招聘启示
+1/9
安徽农业大学许云辉教授课题组招收材料类、化工类、医学类等工科专硕学硕考研调剂
+1/9
you can see 26届计算机、电子信息类、电科考研T j信息pp骏:74+08+76+6+20/
+1/8
青岛大学功能纺织品与先进材料研究院招收2026级申请考核制博士
+1/7
【全奖博士招生】美国科罗拉多大学科罗拉多斯普林斯分校----固体与结构力学
+1/4
中国石油大学(华东)生物质绿色化学转化和生物基功能高分子团队诚招26级硕士生
+1/3
燕山大学-意大利米兰理工大学国际化科研团队招收硕士研究生
+1/3
新加坡南洋理工大学- 光电/ 智能传感/ 脑机接口方向 博士后
+1/1
上海交通大学化学化工学院张智涛课题组诚聘博士后
+1/1
简单回复
2013-08-31 11:48
回复
2013-08-31 13:03
回复













回复此楼