| 查看: 452 | 回复: 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
» 猜你喜欢
售SCI一区T0P文章,我:8.O.55.1.O54,科目全,可伽急
已经有7人回复
售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急
已经有3人回复
售SCI一区T0P文章,我:8.O.55.1.O.5.4,科目全,可+急
已经有6人回复
基础研究怎么拉横向,学校到款任务越来越多,难以完成 拉横向,都有哪些途径啊
已经有6人回复
HXDI做水性聚氨酯乳液,是不是特别容易出渣
已经有3人回复
小木虫看见有人已经知道结果了
已经有19人回复
2026年国自然面上资助率
已经有8人回复
系统今天又提示维护了,估计离放榜不远了
已经有15人回复
微信指数没变化,科研之友没阅读
已经有17人回复
申请2027年材料/化学类博士
已经有5人回复
» 抢金币啦!回帖就可以得到:
求助2013年-2011年,武汉哪所学校的实验室合成过单价3万/克(或毫升)的剧毒成品?
+5/3240
求助2013年-2011年,武汉哪所学校的实验室合成过单价3万/克(或毫升)的剧毒成品?
+5/2365
坐标广州,征女友
+2/164
西湖大学物理学、光学、电子信息方向博士生招生(长期有效)
+5/105
上海 东华大学 刘栋良 招 2027 学术型博士(化学专业)
+1/72
Postdoctoral fellow in Medicinal Chemistry, McGill University
+1/71
Postdoctoral fellow in Medicinal Chemistry, McGill University
+1/71
没基金,自费做nature课题值得吗?
+1/44
西湖大学物理学、光学、电子信息方向博士生招生(长期有效)
+5/25
一株吊兰
+1/12
多本Scopus收录国际英文期刊征稿,全免 APC!含医学期刊
+1/5
国家自然科学基金申报者发榜前心理状态调查,麻烦帮忙填一下哇!
+1/5
给合作老师打个广告,找个做 NMR/PHIP 超极化的 CSC 博士生
+1/5
【招聘】宁波慈溪生物医学工程研究所分析测试中心招聘设备工程师助理劳务派遣人员
+1/5
宁波诺丁汉大学新能源与环境材料技术研究中心招收2027年春季入学博士生
+1/3
分不清 EI 会议 CA 和 JA?90% 投稿人踩过的检索大坑
+1/3
大家有research gate的账号吗?有偿借用
+1/2
肠道再生的"隐形推手"
+1/1
浙江大学王宇课题组诚聘博士后/博士研究生/科研助理(招聘长期有效)
+1/1
iThenticate查SCI论文,一般查几次?有没有技巧一次过?
+1/1
简单回复
2013-08-31 11:48
回复
2013-08-31 13:03
回复










回复此楼