智能雨刮器同步控制程序代码.docx
- 文档编号:12399816
- 上传时间:2023-04-18
- 格式:DOCX
- 页数:19
- 大小:17.90KB
智能雨刮器同步控制程序代码.docx
《智能雨刮器同步控制程序代码.docx》由会员分享,可在线阅读,更多相关《智能雨刮器同步控制程序代码.docx(19页珍藏版)》请在冰豆网上搜索。
智能雨刮器同步控制程序代码
/*
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() 参数说明: 无 返回: 无 *********************
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 智能 雨刮器 同步 控制程序 代码