智能雨刮器同步控制程序代码.docx

上传人:b****1 文档编号:2208360 上传时间:2023-05-02 格式:DOCX 页数:19 大小:17.90KB
下载 相关 举报
智能雨刮器同步控制程序代码.docx_第1页
第1页 / 共19页
智能雨刮器同步控制程序代码.docx_第2页
第2页 / 共19页
智能雨刮器同步控制程序代码.docx_第3页
第3页 / 共19页
智能雨刮器同步控制程序代码.docx_第4页
第4页 / 共19页
智能雨刮器同步控制程序代码.docx_第5页
第5页 / 共19页
智能雨刮器同步控制程序代码.docx_第6页
第6页 / 共19页
智能雨刮器同步控制程序代码.docx_第7页
第7页 / 共19页
智能雨刮器同步控制程序代码.docx_第8页
第8页 / 共19页
智能雨刮器同步控制程序代码.docx_第9页
第9页 / 共19页
智能雨刮器同步控制程序代码.docx_第10页
第10页 / 共19页
智能雨刮器同步控制程序代码.docx_第11页
第11页 / 共19页
智能雨刮器同步控制程序代码.docx_第12页
第12页 / 共19页
智能雨刮器同步控制程序代码.docx_第13页
第13页 / 共19页
智能雨刮器同步控制程序代码.docx_第14页
第14页 / 共19页
智能雨刮器同步控制程序代码.docx_第15页
第15页 / 共19页
智能雨刮器同步控制程序代码.docx_第16页
第16页 / 共19页
智能雨刮器同步控制程序代码.docx_第17页
第17页 / 共19页
智能雨刮器同步控制程序代码.docx_第18页
第18页 / 共19页
智能雨刮器同步控制程序代码.docx_第19页
第19页 / 共19页
亲,该文档总共19页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

智能雨刮器同步控制程序代码.docx

《智能雨刮器同步控制程序代码.docx》由会员分享,可在线阅读,更多相关《智能雨刮器同步控制程序代码.docx(19页珍藏版)》请在冰点文库上搜索。

智能雨刮器同步控制程序代码.docx

智能雨刮器同步控制程序代码

/*

earlyfunction:

1.IICdriverforDAC7678OUTPUT0-5Vanalogsignallevel

2.6scaleforexternalspeed

3.Control2waysignalonthesametime

usedlibraryBounce

2013.11.18

Modifiedby2014.02.17

*/

#include

//定义6档手动调速开关1档最小,6档最大

#defineSPEED_114//NORMAL(min)

#defineSPEED_215//

#defineSPEED_316//

#defineSPEED_417//

#defineSPEED_518//

#defineSPEED_619//MAX

#defineSWITCH_CONTROL23//定义接近开关上对应的单片机的引脚,第23号数字口

#defineSWITCH_CONTROL_125//定义接近开关上对应的单片机的引脚,第25号数字口

#defineTIME_SLOT100//定义时间误差范围在500ms以内,位移误差所导致的时间误差,暂定为500ms,可调

#defineTIME_OUT1000//定义超出最大时间范围,即第一个雨刷器与第二个雨刷器同步时间相差一个周期,定义这个周期最大时间为2000ms

#defineDAC7678_SDA20//定义数字模拟转换模块DAC7678的通信接口,采用二线模拟方式

#defineDAC7678_SCL21

#defineSCL_1digitalWrite(DAC7678_SCL,HIGH)//IIC的时钟线SCL写高

#defineSCL_0digitalWrite(DAC7678_SCL,LOW)//SCL拉低

#defineSDA_1digitalWrite(DAC7678_SDA,HIGH)//IIC的数据线SDA写高

#defineSDA_0digitalWrite(DAC7678_SDA,LOW)//SDA拉低

#defineDAC76780x90//DAC7678模块地址,作为IIC模块

unsignedcharIIC_ACK;

longreferenceTime;//以第一个雨刷器到达接近开关时的时间作为参考时间referenceTime

longreferenceTime1;//第二个雨刷器离开接近开关时的时间referenceTime1

longintervalTime;//记录两个雨刷器到达或离开接近开关的时间间隔intervalTime

booleanstartCount=false;//记数标志位

intdevice2Current;

intdevice1_init_1=1400;//第一个雨刷器速度量化值

intdevice2_init_1=1800;//第二个雨刷器速度量化值

intdevice1_init_2=2100;//第一个雨刷器速度量化值

intdevice2_init_2=2700;//第二个雨刷器速度量化值

intdevice1_init_3=2500;//第一个雨刷器速度量化值

intdevice2_init_3=3214;//第二个雨刷器速度量化值

intdevice1_init_4=2800;//第一个雨刷器速度量化值

intdevice2_init_4=3600;//第二个雨刷器速度量化值

intdevice1_init_5=3200;//第一个雨刷器速度量化值

intdevice2_init_5=4114;//第二个雨刷器速度量化值

intdevice1_init_6=3500;//第一个雨刷器速度量化值

intdevice2_init_6=4500;//第二个雨刷器速度量化值

//Debouncerformotorspeedadjust

BouncebouncerK1=Bounce(SPEED_1,5);//Pin14,5millisecond

BouncebouncerK2=Bounce(SPEED_2,5);//Pin15,5millisecond

BouncebouncerK3=Bounce(SPEED_3,5);//Pin16,5millisecond

BouncebouncerK4=Bounce(SPEED_4,5);//Pin17,5millisecond

BouncebouncerK5=Bounce(SPEED_5,5);//Pin18,5millisecond

BouncebouncerK6=Bounce(SPEED_6,5);//Pin19,5millisecond

//注册接近开关,防止干扰,添加5ms延时抖动

BouncebouncerK7=Bounce(SWITCH_CONTROL,5);//Pin23,5millisecond

BouncebouncerK8=Bounce(SWITCH_CONTROL_1,5);//Pin23,5millisecond

voidsetup()

{

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);//StaticMode启动内部参考24页

SendByte(0x00);

SendByte(0x10);

*/

SendByte(0x90);//FlexibleMode启动内部参考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的值

}

voidloop()

{

bouncerK1.update();//ReadthesignalK1

bouncerK2.update();//ReadthesignalK2

bouncerK3.update();//ReadthesignalK3

bouncerK4.update();//ReadthesignalK4

bouncerK5.update();//ReadthesignalK5

bouncerK6.update();//ReadthesignalK6

bouncerK7.update();//ReadthesignalK7

bouncerK8.update();//ReadthesignalK8

if(bouncerK1.read()==LOW){//valuechanged,andreadytowork

DAC(DAC7678,1,device1_init_1);//写端口1的值,端口1的输出电压作为参考值

intchangedK7=bouncerK7.update();//读第一个接近开关的开关电平

if(changedK7&&bouncerK7.read()==HIGH){//检测到第一个接近开关电平的上升沿变化

referenceTime=millis();//标记时间

startCount=true;//记数开始标志置位

}

if(startCount==true){

intchangedK8=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

device2Current=device2_init_1+500;

}

if((TIME_OUT

device2Current=device2_init_1-500;

}

DAC(DAC7678,2,device2Current);//写端口2的值,端口2的输出电压作为参考值

}//if(bouncerK1.read()==LOW)

if(bouncerK2.read()==LOW){//valuechanged,andreadytowork

DAC(DAC7678,1,device1_init_2);//写端口1的值,端口1的输出电压作为参考值

intchangedK7=bouncerK7.update();//读第一个接近开关的开关电平

if(changedK7&&bouncerK7.read()==HIGH){//检测到第一个接近开关电平的上升沿变化

referenceTime=millis();//标记时间

startCount=true;//记数开始标志置位

}

if(startCount==true){

intchangedK8=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

device2Current=device2_init_2+500;

}

if((TIME_OUT

device2Current=device2_init_2-500;

}

DAC(DAC7678,2,device2Current);//写端口2的值,端口2的输出电压作为参考值

}

if(bouncerK3.read()==LOW){//valuechanged,andreadytowork

DAC(DAC7678,1,device1_init_3);//写端口1的值,端口1的输出电压作为参考值

intchangedK7=bouncerK7.update();//读第一个接近开关的开关电平

if(changedK7&&bouncerK7.read()==HIGH){//检测到第一个接近开关电平的上升沿变化

referenceTime=millis();//标记时间

startCount=true;//记数开始标志置位

}

if(startCount==true){

intchangedK8=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

device2Current=device2_init_3+500;

}

if((TIME_OUT

device2Current=device2_init_3-500;

}

DAC(DAC7678,2,device2Current);//写端口2的值,端口2的输出电压作为参考值

}

if(bouncerK4.read()==LOW){//valuechanged,andreadytowork

DAC(DAC7678,1,device1_init_4);//写端口1的值,端口1的输出电压作为参考值

intchangedK7=bouncerK7.update();//读第一个接近开关的开关电平

if(changedK7&&bouncerK7.read()==HIGH){//检测到第一个接近开关电平的上升沿变化

referenceTime=millis();//标记时间

startCount=true;//记数开始标志置位

}

if(startCount==true){

intchangedK8=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

device2Current=device2_init_4+500;

}

if((TIME_OUT

device2Current=device2_init_4-500;

}

DAC(DAC7678,2,device2Current);//写端口2的值,端口2的输出电压作为参考值

}

if(bouncerK5.read()==LOW){//valuechanged,andreadytowork

DAC(DAC7678,1,device1_init_5);//写端口1的值,端口1的输出电压作为参考值

intchangedK7=bouncerK7.update();//读第一个接近开关的开关电平

if(changedK7&&bouncerK7.read()==HIGH){//检测到第一个接近开关电平的上升沿变化

referenceTime=millis();//标记时间

startCount=true;//记数开始标志置位

}

if(startCount==true){

intchangedK8=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

device2Current=device2_init_5+500;

}

if((TIME_OUT

device2Current=device2_init_5-500;

}

DAC(DAC7678,2,device2Current);//写端口2的值,端口2的输出电压作为参考值

}

if(bouncerK6.read()==LOW){//valuechanged,andreadytowork

DAC(DAC7678,1,device1_init_6);//写端口1的值,端口1的输出电压作为参考值

intchangedK7=bouncerK7.update();//读第一个接近开关的开关电平

if(changedK7&&bouncerK7.read()==HIGH){//检测到第一个接近开关电平的上升沿变化

referenceTime=millis();//标记时间

startCount=true;//记数开始标志置位

}

if(startCount==true){

intchangedK8=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

device2Current=device2_init_6+500;

}

if((TIME_OUT

device2Current=device2_init_6-500;

}

DAC(DAC7678,2,device2Current);//写端口2的值,端口2的输出电压作为参考值

}

elsereturn;

}

/*******************************************************************

函数名:

总线启动函数

函数原型:

voidStart_I2c()

参数说明:

返回:

*********************

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 工程科技 > 能源化工

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2