关于AVR单片机实验器及教学机器人的PWM调速程序的编辑__第1页
关于AVR单片机实验器及教学机器人的PWM调速程序的编辑__第2页
关于AVR单片机实验器及教学机器人的PWM调速程序的编辑__第3页
关于AVR单片机实验器及教学机器人的PWM调速程序的编辑__第4页
关于AVR单片机实验器及教学机器人的PWM调速程序的编辑__第5页
已阅读5页,还剩16页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

单片机实验器及教学机器人的PWM电机调速源程序 双龙电子的SL-DIY系列单片机实验器及教学机器人,可以采用多种软件编写PWM电机调速源程序。现在以SL-DIY02-8A/SL-DIY08-8/SL-DIY08-16单片机实验器及教学机器人为例说明,该机可以采用模块化图形化SLBASIC/SLROBOTC流程图软件、模块化SLBASIC/SLROBOTC解释型语言软件、GCC-AVR、ICC-AVR、BASCOM-AVR等高级语言软件及单片机汇编语言等软件编写程序。目前提供PWM电机调速源程序如下:1.用模块化图形化SLBASIC流程图软件编写PWM调速2.用模块化SLBASIC解释型语言软件编写PWM调速3.用模块化图形化SLROBOTC流程图软件编写PWM调速4.用模块化SLROBOTC解释型语言软件编写PWM调速5.用ICC-AVR的ADC控制教学机器人上直流电机的无级调速程序。6.用ICC-AVR按键控制教学机器人上直流电机的调速程序。7.用GCC-AVR教学机器人上直流电机的调速程序,用中断实现,占用一个Timer。8.用GCC-AVR教学机器人上直流电机的调速程序,不用中断实现,不占用Timer。详细资料在这里下载:/gb/lgzhl.asp单片机实验器及教学机器人的PWM电机调速源程序电机硬件联接原理图如下:1. 用模块化图形化SLBASIC流程图软件编写PWM调速2. 用模块化SLBASIC解释型语言软件编写PWM调速程序清单例1:10 REM SLBASIC;程序文件头20 REM MOTOR 255,255;电机高速运行30 REM WAIT 100;运行时间(延时)40 REM MOTOR 100,100;较低速运行50 REM WAIT 400;运行时间60 REM GOTO 20;循环执行程序清单例2:10 REM SLBASIC;SLBASIC文件头20 REM FOR A=-255 TO 255;输入马达PWM参数30 REM MOTOR A,-A;执行马达PWM参数40 REM WAIT 3;延时50 REM NEXT A;继续执行60 REM MOTOR 0,0;关闭PWM,电机停止70 REM GOTO 20;循环执行3. 用模块化图形化SLROBOTC流程图软件编写PWM调速4. 用模块化SLROBOTC解释型语言软件编写PWM调速程序清单例1:slrobot /*SLROBOT文件头*/start /*程序开始*/lim_loop /*无限循环*/motor(255,255); /*电机参数初值*/wait(100); /*延时1000ms*/motor(100,100); /*电机参数*/wait(400); /*延时4000ms*/end /*程序结束*/程序清单例2:slrobot /*SLROBOT文件头*/start /*程序开始*/lim_loop /*无限循环*/ a=-255;/*设变量a部初值*/ while(a=255) /*如果a=255循环*/ motor(a,-a); /*电机参数初值*/ wait(3);/*延时30ms*/ a=a+1; motor(0,0);/*电机停*/end /*程序结束*/5. 用ICC-AVR的ADC控制教学机器人上直流电机的无级调速程序。SL-DIY08-8教学机器人上用ICC-AVR高级语言编程,使教学机器人前进、后退、右转、左转状态下(用PC.0位的微调电位器作为无级调速)循环程序。该程序也适合在SL-DIY02-8A及SL-DIY08-16单片机开发实验器及教学机器人上移植使用。/ */ * 广 州 天 河 双 龙 电 子 公 司 */ * */ * 实验1:ADC控制教学机器人 */ * 作者: */ * 2006年3月28日 */ * 目标MCU:MEGA48 晶振:外部 8MHZ */ */ICC-AVR/小车在前进、后退、右转、左传状态下循环动作#include#includeunsigned int adc_rel;/AD转换结果void timer1_init(void)/定时器初始化 TCCR1B = 0x00; TCNT1 = 0; TCCR1A = 0x00; TCCR1B = 0x02; /采用8分频/ADC初始化void adc_init(void) ADCSRA = 0x00; /设置前,先关闭ADC ADMUX =(1REFS0);/选择内部AVCC为基准,单端输入口为ADC0 ACSR =(1ACD);/关闭模拟比较器,禁止位P148 ADCSRA=(1ADEN)|(1ADSC)|(1ADIE)|(1ADPS1) ;/ADC时钟64分频/ADC完成中断#pragma interrupt_handler adc_isr:22 void adc_isr(void) adc_rel=ADC&0x3ff; ADMUX=(1REFS0);/选择内部AVCC为基准 ADCSRA|=(1ADSC);/启动AD转换void PortInit(void)/D口初始化DDRD=0XF0;PORTD=0X00;void onward(void)/前进 unsigned int tim=0; / TCNT1=0; /清记数器 tim=TCNT1; while(tim=adc_rel)/输出低电平 tim=TCNT1; PORTD=0x00; if(tim0x3ff) /timer1为16位,ADC为10位,把timer1处理为10位 TCNT1=0; void back(void)/后退 unsigned int tim=0; / TCNT1=0; /清记数器 tim=TCNT1; while(tim=adc_rel)/输出低电平 tim=TCNT1; PORTD=0x00; if(tim0x3ff) /timer1为16位,ADC为10位,把timer1处理为10位 TCNT1=0; void left(void)/左传 unsigned int tim=0; / TCNT1=0; /清记数器 tim=TCNT1; while(tim=adc_rel)/输出低电平 tim=TCNT1; PORTD=0x00; if(tim0x3ff) /timer1为16位,ADC为10位,把timer1处理为10位 TCNT1=0; void right(void)/右转 unsigned int tim=0; / TCNT1=0; /清记数器 tim=TCNT1; while(tim=adc_rel)/输出低电平 tim=TCNT1; PORTD=0x00; if(tim0x3ff) /timer1为16位,ADC为10位,把timer1处理为10位 TCNT1=0; void main(void) unsigned int i;PortInit();timer1_init();adc_init();SEI();/开中断while(1) for(i=1000;i0;i-) onward(); /前进 for(i=1000;i0;i-) back(); /后退 for(i=1800;i0;i-) right(); /右转 for(i=1800;i0;i-) left(); /左转 6. 用ICC-AVR按键控制教学机器人上直流电机的调速程序。SL-DIY08-8单片机开发实验器及教学机器人上用按键(INT0与INT1)控制教学机器人上直流电机的调速,并采用ICC-AVR高级语言编程。AVR单片机PC口上接了多种传感器,用于寻黑线、避障碍、避悬崖。该程序也适合在SL-DIY02-8A及SL-DIY08-16单片机开发实验器及教学机器人上移植使用。/ */ * 广 州 天 河 双 龙 电 子 公 司 */ * */ * 实验2:按键控制教学机器人速度以及PC口传感器的应用 */ * 作者: */ * 2006年8月1日 */ * 目标MCU:MEGA48 晶振:外部 8MHZ */ */ICC-AVR/PC0、PC4分别接水平红外传感,当两边有障碍物时后退转向/PC1垂直红外传感器,当有悬崖时后退转向(传感量的值取反时可用作寻迹)/PC2接微动开关传感器,当撞上障碍物时后退转向/取TIMER0计数器的中间值为电平变化的时刻点#include#includeunsigned int tim=0,speed=150;/*微秒级延时程序 */void delay_us(int time) do time-; while (time1); /* 毫秒级延时程序*/ void delay_ms(unsigned int time) while(time!=0) delay_us(1000); time-; void timer0_init(void)/定时器初始化 TCCR0B = 0x00; TCNT0 = 0x00; TCCR0A = 0x00; TCCR0B = 0x03; /32分频void PortInit(void)/C、D口初始化DDRD=0XF0;DDRC=0X00;PORTC=0XFF;/前进脉冲void onward(void)/前进 TCNT0=0; tim=TCNT0; while(tim=speed) /低电平 tim=TCNT0; PORTD=0x00; /后退脉冲void back(void)/后退 TCNT0=0; tim=TCNT0; while(tim=speed)/低电平 tim=TCNT0; PORTD=0x00; /左传脉冲void left(void)/左转 TCNT0=0; tim=TCNT0; while(tim=speed)/低电平 tim=TCNT0; PORTD=0x00; /右转脉冲void right(void)/右转 TCNT0=0; tim=TCNT0; while(tim=speed)/低电平 tim=TCNT0; PORTD=0x00; /主程序void main(void)unsigned int i; PortInit();timer0_init();while(1) while(PINC&(1PC1)=0)/当PC1引脚为“0”时 onward(); while(PINC&(10;i-) back(); while(PINC&(10;i-) left(); while(PINC&(10;i-) right(); while(PINC&(1PC1)!=0)/当PC1引脚不为“0”时 back(); if(PIND&(1PD2)=0) /当PD2引脚为“0”时即INT0键按下 if(speed0;i-) back(); if(PIND&(111) speed-=10; for(i=100;i0;i-) back(); 7. 用GCC-AVR教学机器人上直流电机的调速程序,用中断实现,占用一个Timer。SL-DIY08-8单片机开发实验器及教学机器人电机调速演示,MOTOR函数用法和SLRobotC一样。/ */ * 广 州 天 河 双 龙 电 子 公 司 */ * */ * 直流电机的调速程序,用中断实现,占用一个Timer */ * 作者: */ * 2006年8月1日 */ * 目标MCU:MEGA48 晶振:外部 8MHZ */ */此程序用于演示小车的PWM功能/gcc编译环境#include #include #define MIN(a,b) (ab)?(a):(b)#define ABS(x) (x0)?(x):(-x)typedef struct struct_SwPwmChannel unsigned char port; unsigned char pin; unsigned char duty; unsigned char setduty; SwPwmChannelType;/ number of PWM channels#define SWPWM_NUM_CHANNELS 2SwPwmChannelType SwPwmChannelsSWPWM_NUM_CHANNELS;unsigned char PosTics;void pwm_init(void) /初始化,Timer溢出频率约450Hz unsigned char index; for(index=0; indexSWPWM_NUM_CHANNELS; index+) SwPwmChannelsindex.duty = 0; SwPwmChannelsindex.setduty = 0; TCCR2A = 0x00; TCCR2B = (1CS22); TCNT2 = 0; TIMSK2 = (1OCIE2A)|(1TOIE2); PosTics = 0; sei ();void pwm_off(void) TCCR2B = 0x00; TIMSK2 &= (1OCIE2A)|(1TOIE2);void pwm_SetChannelIO(unsigned char channel, unsigned char port, unsigned char pin, unsigned char duty) SwPwmChannelschannel.port = port; SwPwmChannelschannel.pin = pin & 0x07; SwPwmChannelschannel.setduty = duty;ISR (SIG_OVERFLOW2) /每次周期结束之后,下周期开始之前,都需要设置比较寄存器的值 unsigned char nextTics = 0xff; unsigned char index; for(index=0; indexSWPWM_NUM_CHANNELS; index+) SwPwmChannelsindex.duty = SwPwmChannelsindex.setduty; if(SwPwmChannelsindex.duty) nextTics = MIN(nextTics, SwPwmChannelsindex.duty); switch ( SwPwmChannelsindex.port ) case B : PORTB |= (1SwPwmChannelsindex.pin); break ; case C : PORTC |= (1SwPwmChannelsindex.pin); break ; case D : PORTD |= (1SwPwmChannelsindex.pin); break ; if (nextTics != 0xff) PosTics = nextTics; OCR2A = nextTics; ISR (SIG_OUTPUT_COMPARE2A) /每PWM周期,此中断一般发生次,一次左路一次右路,/如果左右值相等的话, 每PWM周期,此中断发生1次 unsigned char nextTics = 0xff; unsigned char index; for(index=0; indexSWPWM_NUM_CHANNELS; index+) if(SwPwmChannelsindex.duty) if( (PosTics = SwPwmChannelsindex.duty) switch ( SwPwmChannelsindex.port ) case B : PORTB &= (1SwPwmChannelsindex.pin); break ; case C : PORTC &= (1SwPwmChannelsindex.pin); break ; case D : PORTD &= (1 PosTics) nextTics = MIN(nextTics, SwPwmChannelsindex.duty-PosTics); if (nextTics != 0xff) if (nextTics 2) PosTics += nextTics; OCR2A = PosTics; void MOTOR(int l_motor,int r_motor)/ int l_motor,r_motor; unsigned char l_pin, r_pin; unsigned char l_duty, r_duty;/ unsigned char ss20; pwm_off(); DDRD |= (14)|(15)|(16)|(17); PORTD &= (14)|(15)|(16)|(17); if (l_motor = 0) & (r_motor = 0) pwm_off(); PORTD &= (14)|(15)|(16)|(1 0) l_pin = 5; else l_pin = 4; if (r_motor 0) r_pin = 7; else r_pin = 6; l_motor = ABS(l_motor); r_motor = ABS(r_motor); l_duty = r_duty = 0; if (l_motor = 4) & (l_motor = 4) & (r_motor 251) PORTD |= (1 251) PORTD |= (1r_pin); if ( (l_duty != 0) | (r_duty != 0) ) pwm_init(); if (l_duty) pwm_SetChannelIO(0, D, l_pin , l_duty); if (r_duty) pwm_SetChannelIO(1, D, r_pin , r_duty); void mydelay_loop_2(unsigned int count) while(-count) void WAIT(int val) unsigned int i; for(i=0; ival; i+) mydelay_loop_2(20000); int main(void) for(;) MOTOR(-128,128); WAIT(100); MOTOR(0,0); MOTOR(-128,-128); WAIT(100); MOTOR(0,0); MOTOR(255,-255); WAIT(100); MOTOR(0,0); 8. 用GCC-AVR教学机器人上直流电机的调速程序,不用中断实现,不占用Timer。SL-DIY08-8单片机开发实验器及教学机器人电机调速演示,特点类似FD,BK,LT,RT语句,执行完才返回。/ */ * 广 州 天 河 双 龙 电 子 公 司 */ * */ * 直流电机的调速程序,用中断实现,占用一个Timer */ * 作者: */ * 2006年8月1日 */ * 目标MCU:MEGA48 晶振:外部 8MHZ */ */此程序用于演示小车的PWM功能/gcc编译环境#include #include #include void delayus(unsigned int _count) _delay_loop_2(_count1);void FDX() /* 前进 */ unsigned char PortD_ch; PortD_ch = PORTD; PortD_ch |= (15)|(17); PortD_ch &= (14)|(16); PORTD = PortD_ch;void BKX() /* 后退 */ unsigned char PortD_ch; PortD_ch = PORTD; PortD_ch |= (14)|(16); PortD_ch &= (15)|(17); PORTD = PortD_ch;void LTX() /* 左转 */ unsigned char PortD_ch; PortD_ch = PORTD; PortD_ch |= (14); PortD_ch &= (15); PortD_ch |= (17); PortD_ch &= (16); PORTD = PortD_ch;void RTX() /* 右转 */ unsigned char PortD_ch; PortD_ch = PORTD; PortD_ch |= (15); PortD_ch &= (14); PortD_ch |= (16); PortD_ch &= (17); PORTD = PortD_ch;void STX() PORTD &= (14)|(15)|(16)|(17);void FDPWM(unsigned int val1,unsigned char val2) unsigned int wait1; unsigned int wait2; wait1 = val2 3; wait2 = (256-val2) 3; /wait1+wait2=256,256*8=2048us,PWM周期约2ms,频率500Hz int i; for(i=0; ival1; i+) FDX(); delayus(wait1); STX(); delayus(wait2); void BKPWM(unsigned int val1,unsigned char val2) unsigned int wait1; unsigned int wait2; wait1 = val2 3; wait2 = (256-val2) 3; /wait1+wait2=256,256*8=2048us,PWM周期约2ms,频率500Hz int i; for(i=0; ival1; i+) BKX(); delayus(wait1); STX(); delayus(wait2); void LTPWM(unsigned int val1,unsigned char val2) unsigned int wait1; unsigned int wait2; wait1 = val2 3; wait2 = (256-val2) 3; /wait1+wait2=256,256*8=2048us,PWM周期约2ms,频率500Hz int i; for(i=0; ival1; i+) LTX(); delayus(wait1); STX(); delayus(wait2); void RTPWM(unsigned int val1,unsigned char val2) unsigned int

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论