PWM超声波小车.doc_第1页
PWM超声波小车.doc_第2页
PWM超声波小车.doc_第3页
PWM超声波小车.doc_第4页
PWM超声波小车.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

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

文档简介

PWM超声波小车#include#include#include/#include lcd.h/#include ad.h#include pid.h#include pwm.h#include chaoshenbo.h#define uchar unsigned char#define uint unsigned intuchar k=0x00;float max=3.0;uint adl=0,adh=0;float p=0.0048875855;uchar capv;void compare_ad(void) uchar distance; cli();StartModule();/启动超声波 while(!(PINA & (1 PA1);/ TCCR1B=0X04;/256分频。起动计时 while(PINA & (1 PA1); TCCR1B=0X00;/256分频。 停止计时 distance=(TCNT1*16)*0.034)/2;/cmsei(); / ad_Init(); / _delay_ms(2); OCR0 = PIDCalc( &spid,distance ); _delay_ms(20); int main(void) / LCD1602_Initial(); asm(nop); chaosheninit();/超声波初始化 DDRD |= (1PD4)|(1PD5)|(1PD6)|(1PD7); /pd4左反转,D5右转,D6左正转,D7右正转 PORTD &=(1PD4)|(1PD5)|(1PD6)|(1PD7); PIDInit(&spid); setPID(&spid,10,0,0); spid.SetPoint=45; init_devices(); sei(); while(1) compare_ad(); ;/SIGNAL(SIG_ADC)/ cli(); / uint adjust=0; / uchar q,g; /adl=ADCL; /adh=ADCH;/ adjust=adl; / adjust |=(adh8);/ capv= adjust*p*10; /q=capv%10;/ g=capv/10%10;/ LCD1602_Display(0xc0,g+0x30);/+30将数字转换为ASCII / LCD1602_Display(0xc1,q+0x30); / sei();/#ifndef _pid_h_#define _pid_h_#include #include #include #include #define uchar unsigned char #define uint unsigned int int dError,Error;/*pid初始化*/ struct PID float SetPoint; / 设定目标 Desired Valuefloat Proportion; / 比例常数 Proportional Constfloat Integral; / 积分常数 Integral Constfloat Derivative; / 微分常数 Derivative Const float SumError;float LastError; / Error11float PrevError; / Error12 spid;/*PID 结构体初始化*/void PIDInit (struct PID *pp) memset(pp,0,sizeof(struct PID);/*PID 参数设置*/void setPID(struct PID *pp,float a,float b,float c)pp-Proportion=a;pp-Integral=b;pp-Derivative=c;/*PID 计算部分*/=*/unsigned char PIDCalc( struct PID *pp, unsigned char NextPoint )Error = pp-SetPoint - NextPoint; / 偏差if(fabs(Error)25) TIMSK = 0x01; /timer interrupt sources不用中断,自动清0 return 0xff; else if(fabs(Error)Proportion * Error) );/ 比例项 SIGNAL(SIG_OUTPUT_COMPARE0)/比较中断PORTD &=(1PD6)|(1PD7);PORTD &=(1PD4)|(1PD5);/后退SIGNAL(SIG_OVERFLOW0)/溢出中断 TCNT0 = 0x01; if(fabs(Error)3 )/停止 PORTD &=(1PD4)|(1PD5)|(1PD6)|(1PD7); if(Error-3)/前进 PORTD &=(1PD4)|(1PD5); PORTD |= (1PD6)|(13)/后退 PORTD &=(1PD6)|(1PD7); PORTD |= (1PD4)|(1PD5);/后退 _delay_ms(10);#endif/*/定时器TO的使用例程快速PWM模式/作者:宝山/时间:2008.06.02/编译环境:ICCV7 for AVR/晶体: 11.0592Mhz/*/*头文件*/#include #include #include #define uint unsigned int#define uchar unsigned char#define nop() asm(nop()#include pid.hvoid port_init(void)DDRB |= _BV(PB3); /PB3为PWM输出void timer0_init(void)TCCR0 = 0x00; /stopTCNT0 = 0x01;/OCR0 = 0x01; /改变此值可改变占空比/OCR0 = 0x0f; /改变此值可改变占空比TCCR0 = 0x4D; /设置为快速PWM模式,匹配时OC0置1,分频系数1024,比较发生时清0/ 频率计算公式:fOCn= fclk/(N*256)/ N=1024/ fOC0=11059200/(1024*256)=42.1875Hz/ 在PB3管脚输出占空比可调,频率为42.1875Hz的PWM信号/ 通过改变分频系数N改变频率void init_devices(void)/cli(); /disable all interruptsport_init();timer0_init();MCUCR = 0x00;GICR = 0x00;TIMSK = 0x03; /timer interrupt sources不用中断,自动清0/sei(); /re-enable interrupts/all peripherals are now initialized/*文件:ad.h*/#ifndef _ad_H_#define _ad_H_ #define uchar unsigned char #define uint unsigned int #include#includelcd.h/*ad转抑换*/ad初始化void ad_Init(void) ADMUX=0X00;/外部参考电压,0 通道 ADCSRA |=_BV(ADEN)|_BV(ADIE);/|_BV(ADPS2)|_BV(ADATE);/使能ADC,中断允许,自由模式, 时钟: ck/16/自动触发 ADCSRA |=_BV(ADSC);/自由模式开始转换 DDRA &= (_BV(PA0);#endif/*文件:chaoshenbo.h用途:超声波传感器*/#ifndef _chaoshenbo_H_#define _chaoshenbo_H_#include #define TX (1PA0)#define RX (1PA1)#define uchar unsigned char #define uint unsigned int /超声波模块初始化void chaosheninit(void) DDRA |= TX; /pB0设置为输出DDRA &= RX; /pB1设置为输入 PORTA=0X00;/写指令void StartModule() /启动模块 PORTA|=TX; TCNT1H=0X00; TCNT1L=0X00;/初值 /启动一次模块 _delay_us(15); PORTA&=TX; #endif/液晶显示程序#ifndef _lcd_h_#define _lcd_h_#define uint unsigned int#define uchar unsigned char#define RS PB0#define RW PB1#define EN PB2void LCD1602_Initial(void) DDRB=0xff;PORTB=0xff;DDRC=0xff;PORTC=0xff;LCD1602_CommandWrite(0x38);/功能设置两行显示,5*7_delay_ms(1);LCD1602_CommandWrite(0x01);/清屏,回到时80_delay_ms(1);LCD1602_CommandWrite(0x06);_delay_ms(1);LCD1602_CommandWrite(0x0c);/关光标闪烁_delay_ms(1);/*1602写命令字子函数*/void LCD1602_CommandWrite(uchar com)LCD1602_BusyCheck();PORTB&=(1RS); /RS引脚置为低电平,写命令字节PORTC=com; /将数据送到8位并行数据口PORTB|=(1EN); /EN引脚电平上升将命令字写入1602内部_delay_ms(1); /延时5ms,保持EN电平PORTB&=(1EN); /时钟脉冲复位,准备下一次写操作/*1602写数据子函数*/void LCD1602_ByteWrite(uchar date)LCD1602_BusyCheck();PORTB|=(1RS); /RS引脚高电平,准备写数据字节PORTC=date; /将数据送到8位并行数据口PORTB|=(1EN); /EN引脚上升将数据字节写入1602_delay_ms(1); /延时5ms,保持EN电平PORTB&=(1EN); /时钟脉冲复位,准备下一次写操作/*在某位置显示某字符,参数adr为待写地址,date为待写字节*/void LCD1602_Display(uchar adr,uchar date)LCD1602_BusyCheck();LCD1602_CommandWrite(adr);LCD1602_BusyCheck();LCD1602_ByteWrite(date); void LCD1602_Busy

温馨提示

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

评论

0/150

提交评论