智能雨刮器同步控制程序代码.doc_第1页
智能雨刮器同步控制程序代码.doc_第2页
智能雨刮器同步控制程序代码.doc_第3页
智能雨刮器同步控制程序代码.doc_第4页
智能雨刮器同步控制程序代码.doc_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

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

文档简介

/*early function :1. IIC driver for DAC7678 OUTPUT 0-5V analog signal level2. 6 scale for external speed3. Control 2 way signal on the same timeused library Bounce2013.11.18Modified by 2014.02.17*/#include /定义6档手动调速开关 1档最小,6档最大#define SPEED_1 14 / NORMAL(min)#define SPEED_2 15 / #define SPEED_3 16 / #define SPEED_4 17 / #define SPEED_5 18 / #define SPEED_6 19 / MAX#define SWITCH_CONTROL 23 / 定义接近开关上对应的单片机的引脚,第23号数字口#define SWITCH_CONTROL_1 25 / 定义接近开关上对应的单片机的引脚,第25号数字口#define TIME_SLOT 100 / 定义时间误差范围在500ms以内,位移误差所导致的时间误差,暂定为500ms,可调#define TIME_OUT 1000 / 定义超出最大时间范围,即第一个雨刷器与第二个雨刷器同步时间相差一个周期,定义这个周期最大时间为2000ms#define DAC7678_SDA 20 /定义数字模拟转换模块DAC7678的通信接口,采用二线模拟方式#define DAC7678_SCL 21#define SCL_1 digitalWrite(DAC7678_SCL,HIGH) / IIC的时钟线 SCL 写高#define SCL_0 digitalWrite(DAC7678_SCL,LOW) / SCL 拉低#define SDA_1 digitalWrite(DAC7678_SDA,HIGH) / IIC的数据线 SDA 写高#define SDA_0 digitalWrite(DAC7678_SDA,LOW) / SDA 拉低#define DAC7678 0x90 / DAC7678模块地址,作为IIC模块unsigned char IIC_ACK;long referenceTime; / 以第一个雨刷器到达接近开关时的时间作为参考时间referenceTimelong referenceTime1; / 第二个雨刷器离开接近开关时的时间referenceTime1long intervalTime; / 记录两个雨刷器到达或离开接近开关的时间间隔 intervalTime boolean startCount = false; / 记数标志位int device2Current;int device1_init_1 = 1400; / 第一个雨刷器速度量化值int device2_init_1= 1800; / 第二个雨刷器速度量化值int device1_init_2= 2100; / 第一个雨刷器速度量化值int device2_init_2 = 2700; / 第二个雨刷器速度量化值int device1_init_3= 2500; / 第一个雨刷器速度量化值int device2_init_3 = 3214; / 第二个雨刷器速度量化值int device1_init_4= 2800; / 第一个雨刷器速度量化值int device2_init_4= 3600; / 第二个雨刷器速度量化值int device1_init_5= 3200; / 第一个雨刷器速度量化值int device2_init_5 = 4114; / 第二个雨刷器速度量化值int device1_init_6= 3500; / 第一个雨刷器速度量化值int device2_init_6= 4500; / 第二个雨刷器速度量化值 /Debouncer for motor speed adjustBounce bouncerK1 = Bounce( SPEED_1 , 5 ); /Pin 14, 5 millisecondBounce bouncerK2 = Bounce( SPEED_2 , 5 ); /Pin 15, 5 millisecondBounce bouncerK3 = Bounce( SPEED_3 , 5 ); /Pin 16, 5 millisecondBounce bouncerK4 = Bounce( SPEED_4 , 5 ); /Pin 17, 5 millisecondBounce bouncerK5 = Bounce( SPEED_5 , 5 ); /Pin 18, 5 millisecondBounce bouncerK6 = Bounce( SPEED_6 , 5 ); /Pin 19, 5 millisecond/注册接近开关,防止干扰,添加5ms延时抖动Bounce bouncerK7= Bounce( SWITCH_CONTROL , 5 ); /Pin 23, 5 millisecondBounce bouncerK8= Bounce( SWITCH_CONTROL_1 , 5 ); /Pin 23, 5 millisecondvoid setup() pinMode(SPEED_1,INPUT); pinMode(SPEED_2,INPUT); pinMode(SPEED_3,INPUT); pinMode(SPEED_4,INPUT); pinMode(SPEED_5,INPUT); pinMode(SPEED_6,INPUT); pinMode(SWITCH_CONTROL ,INPUT_PULLUP); /设置接近开关引脚为输入模式,并且内部上拉到高电平 pinMode(SWITCH_CONTROL_1 ,INPUT_PULLUP); /设置接近开关引脚1为输入模式,并且内部上拉到高电平 pinMode(DAC7678_SDA,OUTPUT); pinMode(DAC7678_SCL,OUTPUT); Start_I2c(); / 启动IIC协议 SendByte(0x90); /DAC地址,DDR0接地了。见英文DATASHEET说明书 28页 /* SendByte(0x80); /Static Mode 启动内部参考 24页 SendByte(0x00); SendByte(0x10); */ SendByte(0x90); /Flexible Mode 启动内部参考 24页 SendByte(0x40); SendByte(0x00); Stop_I2c(); / 关闭IIC协议 DAC(DAC7678,0,0); /写端口0的值 DAC(DAC7678,1,0); /写端口1的值 DAC(DAC7678,2,0); /写端口2的值 DAC(DAC7678,3,0); /写端口3的值 DAC(DAC7678,4,0); /写端口4的值 DAC(DAC7678,5,0); /写端口5的值 DAC(DAC7678,6,0); /写端口6的值 DAC(DAC7678,7,0); /写端口7的值void loop() bouncerK1.update ( ); /Read the signal K1 bouncerK2.update ( ); /Read the signal K2 bouncerK3.update ( ); /Read the signal K3 bouncerK4.update ( ); /Read the signal K4 bouncerK5.update ( ); /Read the signal K5 bouncerK6.update ( ); /Read the signal K6 bouncerK7.update ( ); /Read the signal K7 bouncerK8.update ( ); /Read the signal K8 if ( bouncerK1.read() = LOW ) /value changed, and ready to work DAC(DAC7678,1,device1_init_1); /写端口1的值,端口1的输出电压作为参考值 int changedK7 = bouncerK7.update ( ); / 读第一个接近开关的开关电平 if( changedK7 & bouncerK7.read() = HIGH) / 检测到第一个接近开关电平的上升沿变化 referenceTime = millis(); / 标记时间 startCount = true; / 记数开始标志置位 if( startCount=true ) int changedK8 = bouncerK8.update ( ); / 读第二个接近开关的开关电平 if( changedK8 & (bouncerK8.read() = LOW) / 检测到第二个接近开关电平的下降沿变化 referenceTime1 = millis(); / 标记时间 startCount = false; / 记数开始标志清零 intervalTime= referenceTime1-referenceTime; if( intervalTime = TIME_SLOT) / 雨刷器位移在误差范围内,不需要调整第二个雨刷器的速度 device2Current = device2_init_1+0 ; if( TIME_SLOT intervalTime ) & (intervalTime = TIME_OUT ) ) /第二个雨刷器速度慢,需要增加第二个雨刷器的速度 device2Current = device2_init_1 + 500 ; if( TIME_OUT intervalTime ) ) /第二个雨刷器速度快,需要降低第二个雨刷器的速度 device2Current = device2_init_1 - 500 ; DAC(DAC7678,2,device2Current); /写端口2的值,端口2的输出电压作为参考值 /if ( bouncerK1.read() = LOW ) if ( bouncerK2.read() = LOW ) /value changed, and ready to work DAC(DAC7678,1,device1_init_2 ); /写端口1的值,端口1的输出电压作为参考值 int changedK7 = bouncerK7.update ( ); / 读第一个接近开关的开关电平 if( changedK7 & bouncerK7.read() = HIGH) / 检测到第一个接近开关电平的上升沿变化 referenceTime = millis(); / 标记时间 startCount = true; / 记数开始标志置位 if( startCount=true ) int changedK8 = bouncerK8.update ( ); / 读第二个接近开关的开关电平 if( changedK8 & (bouncerK8.read() = LOW) / 检测到第二个接近开关电平的下降沿变化 referenceTime1 = millis(); / 标记时间 startCount = false; / 记数开始标志清零 intervalTime= referenceTime1-referenceTime; if( intervalTime = TIME_SLOT) / 雨刷器位移在误差范围内,不需要调整第二个雨刷器的速度 device2Current = device2_init_2+0 ; if( TIME_SLOT intervalTime ) & (intervalTime = TIME_OUT ) ) /第二个雨刷器速度慢,需要增加第二个雨刷器的速度 device2Current = device2_init_2 + 500 ; if( TIME_OUT intervalTime ) ) /第二个雨刷器速度快,需要减少第二个雨刷器的速度 device2Current = device2_init_2 - 500 ; DAC(DAC7678,2,device2Current); /写端口2的值,端口2的输出电压作为参考值 if ( bouncerK3.read() = LOW ) /value changed, and ready to work DAC(DAC7678,1,device1_init_3 ); /写端口1的值,端口1的输出电压作为参考值 int changedK7 = bouncerK7.update ( ); / 读第一个接近开关的开关电平 if( changedK7 & bouncerK7.read() = HIGH) / 检测到第一个接近开关电平的上升沿变化 referenceTime = millis(); / 标记时间 startCount = true; / 记数开始标志置位 if( startCount=true ) int changedK8 = bouncerK8.update ( ); / 读第二个接近开关的开关电平 if( changedK8 & (bouncerK8.read() = LOW) / 检测到第二个接近开关电平的下降沿变化 referenceTime1 = millis(); / 标记时间 startCount = false; / 记数开始标志清零 intervalTime= referenceTime1-referenceTime; if( intervalTime = TIME_SLOT) / 雨刷器位移在误差范围内,不需要调整第二个雨刷器的速度 device2Current = device2_init_3+0 ; if( TIME_SLOT intervalTime ) & (intervalTime = TIME_OUT ) ) /第二个雨刷器速度慢,需要增加第二个雨刷器的速度 device2Current = device2_init_3 + 500 ; if( TIME_OUT intervalTime ) ) /第二个雨刷器速度快,需要减少第二个雨刷器的速度 device2Current = device2_init_3 - 500 ; DAC(DAC7678,2,device2Current); /写端口2的值,端口2的输出电压作为参考值 if ( bouncerK4.read() = LOW ) /value changed, and ready to work DAC(DAC7678,1,device1_init_4 ); /写端口1的值,端口1的输出电压作为参考值 int changedK7 = bouncerK7.update ( ); / 读第一个接近开关的开关电平 if( changedK7 & bouncerK7.read() = HIGH) / 检测到第一个接近开关电平的上升沿变化 referenceTime = millis(); / 标记时间 startCount = true; / 记数开始标志置位 if( startCount=true ) int changedK8 = bouncerK8.update ( ); / 读第二个接近开关的开关电平 if( changedK8 & (bouncerK8.read() = LOW) / 检测到第二个接近开关电平的下降沿变化 referenceTime1 = millis(); / 标记时间 startCount = false; / 记数开始标志清零 intervalTime= referenceTime1-referenceTime; if( intervalTime = TIME_SLOT) / 雨刷器位移在误差范围内,不需要调整第二个雨刷器的速度 device2Current = device2_init_4+0 ; if( TIME_SLOT intervalTime ) & (intervalTime = TIME_OUT ) ) /第二个雨刷器速度慢,需要增加第二个雨刷器的速度 device2Current = device2_init_4 + 500 ; if( TIME_OUT intervalTime ) ) /第二个雨刷器速度快,需要减少第二个雨刷器的速度 device2Current = device2_init_4 - 500 ; DAC(DAC7678,2,device2Current); /写端口2的值,端口2的输出电压作为参考值 if ( bouncerK5.read() = LOW ) /value changed, and ready to work DAC(DAC7678,1,device1_init_5 ); /写端口1的值,端口1的输出电压作为参考值 int changedK7 = bouncerK7.update ( ); / 读第一个接近开关的开关电平 if( changedK7 & bouncerK7.read() = HIGH) / 检测到第一个接近开关电平的上升沿变化 referenceTime = millis(); / 标记时间 startCount = true; / 记数开始标志置位 if( startCount=true ) int changedK8 = bouncerK8.update ( ); / 读第二个接近开关的开关电平 if( changedK8 & (bouncerK8.read() = LOW) / 检测到第二个接近开关电平的下降沿变化 referenceTime1 = millis(); / 标记时间 startCount = false; / 记数开始标志清零 intervalTime= referenceTime1-referenceTime; if( intervalTime = TIME_SLOT) / 雨刷器位移在误差范围内,不需要调整第二个雨刷器的速度 device2Current = device2_init_5+0 ; if( TIME_SLOT intervalTime ) & (intervalTime = TIME_OUT ) ) /第二个雨刷器速度慢,需要增加第二个雨刷器的速度 device2Current = device2_init_5 + 500 ; if( TIME_OUT intervalTime ) ) /第二个雨刷器速度快,需要减少第二个雨刷器的速度 device2Current = device2_init_5 - 500 ; DAC(DAC7678,2,device2Current); /写端口2的值,端口2的输出电压作为参考值 if ( bouncerK6.read() = LOW ) /value changed, and ready to work DAC(DAC7678,1,device1_init_6); /写端口1的值,端口1的输出电压作为参考值 int changedK7 = bouncerK7.update ( ); / 读第一个接近开关的开关电平 if( changedK7 & bouncerK7.read() = HIGH) / 检测到第一个接近开关电平的上升沿变化 referenceTime = millis(); / 标记时间 startCount = true; / 记数开始标志置位 if( startCount=true ) int changedK8 = bouncerK8.update ( ); / 读第二个接近开关的开关电平 if( changedK8 & (bouncerK8.read() = LOW) / 检测到第二个接近开关电平的下降沿变化 referenceTime1 = millis(); / 标记时间 startCount = false; / 记数开始标志清零 intervalTime= referenceTime1-referenceTime; if( intervalTime = TIME_SLOT) / 雨刷器位移在误差范围内,不需要调整第二个雨刷器的速度 device2Current = device2_init_6+0 ; if( TIME_SLOT intervalTime ) & (intervalTime = TIME_OUT ) ) /第二个雨刷器速度慢,需要增加第二个雨刷器的速度 device2Current = device2_init_6 + 500 ; if( TIME_OUT intervalTime ) ) /第二个雨刷器速度快,需要减少第二个雨刷器的速度 device2Current= device2_init_6 - 500 ; DAC(DAC7678,2,device2Current); /写端口2的值,端口2的输出电压作为参考值 else return ;/*函数名:总线启动函数函数原型:void Start_I2c()参数说明:无返回: 无 */void Start_I2c() SDA_1; /*发送起始条件的数据信号*/ delayMicroseconds(1); SCL_1; delayMicroseconds(5); /*起始条件建立时间大于4.7us,延时*/ SDA_0; /*发送起始信号*/ delayMicroseconds(5); /* 起始条件锁定时间大于4s*/ SCL_0; /*准备发送或接收数据 */ delayMicroseconds(2);/*函数名:总线结束函数函数原型:void Stop_I2c()参数说明:无返回: 无 */void Stop_I2c() /*发送结束条件的数据信号*/ SDA_0; /*发送结束条件的时钟信号*/ delayMicroseconds(1); /*结束条件建立时间大于4s*/ SCL_1; delayMicroseconds(5); SDA_1; /*发送I2C总线结束信号*/ delayMicroseconds(4);/*函数名:发送字节函数函数原型:void SendByte(unsigned char c)参数说明:c 发送的数据返回: 无*/void SendByte(unsigned char c) unsigned char BitCnt; for(BitCnt=0;BitCnt8;BitCnt+) /*要传送的数据长度为8位*/ if(cBitCnt)&0x80)/*判断发送位*/ /从高位开始传送 SDA_1; else SDA_0; delayMicroseconds(1); SCL_1; /*置时钟线为高,通知被控器开始接收数据位*/ delayMicroseconds(4); /*保证时钟高电平周期大于4s*/ SCL_0; delayMicroseconds(2); SDA_1; /*8位发送完后释放数据线,准备接收应答位*/ delayMicroseconds(2); SCL_1; delayMicroseconds(3); pinMode(DAC7678_SDA,INPUT_PULLUP); /设置为输入 if(digitalRead(DAC7678_SDA) ) /*判断是否接收到应答信号*/ IIC_ACK = 0; else IIC_ACK = 1; SCL_0; pinMode(DAC7678_SDA,OUTPUT); /设置为输出 delayMicroseconds(2);/*函数名:字节接收函数函数原型:unsigned char RcvByte()参数说明:无返回: 有*/ unsigned char RcvByte() unsigned char retc; unsigned char BitCnt; retc=0; pinMode(DAC7678_SDA,INPUT_PULLUP); /*置

温馨提示

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

评论

0/150

提交评论