| 查看: 416 | 回复: 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
» 猜你喜欢
AI 太可怕了,写基金时,提出想法,直接生成的文字比自己想得深远,还有科学性
已经有6人回复
有院领导为了换新车,用横向课题经费买了俩车
已经有9人回复
酰胺脱乙酰基
已经有13人回复
博士延得我,科研能力直往上蹿
已经有8人回复
同年申请2项不同项目,第1个项目里不写第2个项目的信息,可以吗
已经有4人回复
有时候真觉得大城市人没有县城人甚至个体户幸福
已经有10人回复
天津大学招2026.09的博士生,欢迎大家推荐交流(博导是本人)
已经有5人回复
遇见不省心的家人很难过
已经有22人回复
» 抢金币啦!回帖就可以得到:
Postdoctoral Research Fellow Position in Causal Inference Weill CorneIl Medicine
+1/92
供应爱德华RV 3、RV 12,阿特拉斯及莱宝真空品牌油泵及分子泵等真空产品15216851283
+1/84
黄汉民团队联合淮北师范大学招聘师资博士后(年薪30-40万)
+1/83
香港科技大学(广州)黄加强课题组智能电池方向博士招聘
+1/82
广州大学“长江学者”教授团队2026年海内外高层次人才招聘(环境/化学/生物)
+1/79
坐标浙江宁波,诚征女友
+1/62
同济大学脑机智能团队脑机接口方向招生招聘
+1/46
中国科学院深圳先进技术研究院——招聘博士后
+2/36
上海交通大学大气环境科学课题组招收2026年入学博士生
+1/35
香港城市大学软物质课题组现招收博士研究生 2026.09 入学
+1/32
上海工程技术大学张培磊教授团队招收博士生
+1/22
中国科学技术大学环境系招生
+1/15
新加坡 南洋理工大学- 智能光子/ 传感 PHD 全奖一名 2026 - 8 月入学
+1/11
江汉大学轩亮教授课题组招博士研究生/博士后
+1/6
澳科大药诚招2026年秋季药剂学/生物材料硕士研究生
+1/6
2026年 陕西科技大学 环境学院 招收博士生(化学/材料/环境/生物 背景均可)
+1/5
【经验分享】CRISPR基因敲除细胞系构建全流程踩坑指南——从递送方式选择到克隆筛选
+1/4
江汉大学轩亮教授课题组招博士研究生/博士后
+1/2
推荐一款可以AI辅助写作的Latex编辑器SmartLatexEditor,超级好用,AI润色,全免费
+1/1
自荐:大模型ai辅助论文阅读软件:EasyReader论文易读
+1/1
简单回复
2013-08-31 11:48
回复
2013-08-31 13:03
回复













回复此楼