Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Fork of LGstaandart by
Diff: vibro.c
- Revision:
- 207:d1ce992f5d17
- Parent:
- 205:775d54fdf646
- Child:
- 208:19150d2b528f
--- a/vibro.c Tue Dec 20 14:08:17 2016 +0000
+++ b/vibro.c Fri Jan 13 08:27:28 2017 +0000
@@ -5,8 +5,8 @@
//int reper=0;
int Rate2VibFlag,countA=0,tempDP,vibrot=0,fnoize=0,Znak=0,tempy,ttempo;
unsigned int OldMaxAmp=0;
-
-
+int z=25;
+int i=16,tempi=0;
__irq void EINT3_IRQHandler()
{ Gyro.EXT_Latch=1;
// Gyro.DeltaEXT_Event=1;
@@ -27,14 +27,14 @@
}
else
{
- ClrV1 //установить в регистре PinReg бит "вибро 1" в "1"
+ ClrV1 //установить в регистре PinReg бит "вибро 1" в "1"
}
}
else {//вторая нога вибро
if((Time_vibro>Gyro.AmpN1)&&(Time_vibro<Gyro.AmpN2))
{
- SetV2 //установить в регистре PinReg бит "вибро 2" в "0"
+ SetV2 //установить в регистре PinReg бит "вибро 2" в "0"
}
else
{
@@ -108,7 +108,7 @@
*/
-
+/*
void CalcAmpD(void)
{
unsigned int Nmax=0;
@@ -130,6 +130,7 @@
Gyro.AmpPerDel++;
if (Gyro.AmpPerDel>10){Znak=1; fnoize++;}
break;
+
case 1:
Gyro.AmpPerDel--;
if (Gyro.AmpPerDel<1)Znak=0;
@@ -139,27 +140,30 @@
case 2:
Gyro.AmpPerDel++;
if (Gyro.AmpPerDel>7){Znak=3; fnoize++;}
- break;
+ break;
+
case 3:
Gyro.AmpPerDel--;
if (Gyro.AmpPerDel<1)Znak=2;
- if (fnoize>12){Znak=4;/*fnoize=0;*/}
+ if (fnoize>12){Znak=4;}
break;
case 4:
Gyro.AmpPerDel++;
if (Gyro.AmpPerDel>15){Znak=5; fnoize++;}
break;
+
case 5:
Gyro.AmpPerDel--;
if (Gyro.AmpPerDel<1)Znak=4;
- if (fnoize>18){Znak=6;/*fnoize=0;*/}
+ if (fnoize>18){Znak=6;}
break;
case 6:
Gyro.AmpPerDel++;
if (Gyro.AmpPerDel>6){Znak=7;fnoize++;}
break;
+
case 7:
Gyro.AmpPerDel--;
if (Gyro.AmpPerDel<1)Znak=6;
@@ -169,8 +173,23 @@
}
LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
}
+*/
+void CalcAmpD(void)
+{
+ i++;
+ unsigned int Nmax=0;
+ Gyro.AmpPerDel = ModArrayTriangle[i];
+ srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин.
+ Gyro.AmpT = (rand() % 2);// ОШУМЛЕНИЕ amp
+
+ Nmax = (unsigned int)((100000/(Gyro.Frq>>16))-1);
+ Gyro.AmpN1=(unsigned int)((Nmax*((100-Gyro.AmpPer)+Gyro.AmpPerDel+Gyro.AmpT))/(Gyro.Frq>>16)); //левая граница амплитуды
+ Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
+ if(i>32) i = 0;
+ LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
+}
/*
@@ -214,24 +233,33 @@
}
*/
+ int Mrand(void)
+ {
+ int b=0;
+ z=z*Gyro.AD_Slow;
+ b = ((z>>10) & 0xf)+20;
+ /* sprintf((Time),"%d\r\n", b);
+ WriteCon(Time);*/
+ return b;
+ }
void OLDCalcAmpN(void)//расчет точек старта и стопа импульса вибропривода и расчет частоты ошумления.
-{
- static int PeriodCount = 0;
+{
+ static int PeriodCount = 0,Period=0;
unsigned int Nmax=0, lowper=0;
//расчет амплитуды относительно центральной точки
if(PeriodCount>= Gyro.AmpT) { //если количество заходов в прерывание больше либо равно частоте ошумления.
PeriodCount=0;//сбрасываем таймер
- if (Cheng_AMP_Flag==0) { //сейчас малая амплитуда?
+ if (Cheng_AMP_Flag==0) { //сейчас малая амплитуда?
if((Gyro.AmpPer+Gyro.AmpPerDel)>90) {
Gyro.AmpPer=90-Gyro.AmpPerDel; //проверка верхней граници амплитуды
}
- Nmax =(unsigned int)((100000/(Gyro.Frq>>16))-1); //
+ Nmax =(unsigned int)((103000/(Gyro.Frq>>16))-1); //
Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer))/Gyro.FrqHZ); //левая граница амплитуды
Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
- if(Gyro.AmpPer<6)
+ if(Gyro.AmpPer<20)
{
lowper = Gyro.AmpN2-Gyro.AmpN1;
lowper=lowper/2;
@@ -247,10 +275,10 @@
Gyro.AmpPer=90-Gyro.AmpPerDel; //проверка верхней граници амплитуды
}
- Nmax =(unsigned int)((100000/(Gyro.Frq>>16))-1);
+ Nmax =(unsigned int)((103000/(Gyro.Frq>>16))-1);
Gyro.AmpN1=(unsigned int)((Nmax*(100-Gyro.AmpPer+Gyro.AmpPerDel))/Gyro.FrqHZ);//левая граница амплитуды
Gyro.AmpN2=(unsigned int)((Nmax/2)-Gyro.AmpN1); //правая граница амплитуды
- if(Gyro.AmpPer<6)
+ if(Gyro.AmpPer<20)
{
lowper = Gyro.AmpN2-Gyro.AmpN1;
lowper=lowper/2;
@@ -259,18 +287,37 @@
// Gyro.AmpN2=Gyro.AmpN1+2;
Cheng_AMP_Flag=0;
- }
- /* sprintf((Time),"%d %d %d %d\r\n", Gyro.AmpPer, Nmax, Gyro.AmpN1, Gyro.AmpN2 );//выдаем в терминал для постройки граффика регулировки периметра.
- WriteCon(Time);*/
- srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин.
- Gyro.AmpT = (rand() % Gyro.AmpTD+Gyro.AmpMin);// ОШУМЛЕНИЕ amp
-
+ }
+
+ // Period=Gyro.CuruAngle*101;
+
+ srand(Global_Time);//инициализация функции rand() для получения новых случайных велечин.
+ // srand(Mrand());
+ Gyro.AmpT = (rand() % Gyro.AmpTD+Gyro.AmpMin);// ОШУМЛЕНИЕ amp
+
} else {
PeriodCount++;//таймер амплитуды
}
-LPC_TIM1->MR0 =(unsigned int)(100000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
+LPC_TIM1->MR0 =(unsigned int)(103000000/((Gyro.Frq)>>11));//запись в таймер нового значение частоты вибро
}
+
+/*дол лучших времен
+unsigned long mwc()
+{
+static unsigned long x3456789,
+y=362436069,
+z=77465321,
+c=13579;
+unsigned long long t;
+tС6905990LL*x+c;
+x=y;
+y=z;
+c=(t>>32);
+return z=(t&0xffffffff);
+}
+*/
+
void VibroAMPRegul(void) //подстройка амплитуды ВП
{
Gyro.CaunPlus = CaunAddPlus;//амплитуда по модулю из востановленного синиуса Buff_Restored_sin
@@ -278,11 +325,12 @@
Gyro.CaunMin = CaunAddMin; //амплитуда по модулю из востановленного синиуса Buff_Restored_sin
CaunAddMin = 0;
Gyro.MaxAmp = Gyro.CaunPlus + Gyro.CaunMin; //расчет максимальной амплитуды из востановленного синуса р-р.
- Gyro.Amp -= (Gyro.MaxAmp - Gyro.AmpTarget) * Gyro.AmpSpeed; // расчет амплитуды ВП с учетом разници
- if((Gyro.Amp>>16) > Gyro.AmpPerMax) {Gyro.Amp = (Gyro.AmpPerMax << 16);} // временное ограничение роста амплитуды ВП в случае неподоженного гироскопа//////////
- if((Gyro.Amp>>16) < Gyro.AmpPerMin) {Gyro.Amp = (Gyro.AmpPerMin << 16);} // временное ограничение роста амплитуды ВП в случае неподоженного гироскопа//////////
+ Gyro.Amp -=(int)(((Gyro.MaxAmp - Gyro.AmpTarget) * Gyro.AmpSpeed)); // расчет амплитуды ВП с учетом разници
+ //if((Gyro.Amp>>16) > Gyro.AmpPerMax) {Gyro.Amp = (Gyro.AmpPerMax << 16);} // временное ограничение роста амплитуды ВП в случае неподоженного гироскопа//////////
+ // if((Gyro.Amp>>16) < Gyro.AmpPerMin) {Gyro.Amp = (Gyro.AmpPerMin << 16);} // временное ограничение роста амплитуды ВП в случае неподоженного гироскопа//////////
if(Gyro.RgConA&0x20) {Gyro.AmpPer = Gyro.Amp>>16;} //приведение амплитуды ВП к виду 0%-100%
-
+ /* sprintf((Time),"%d %d %d %d\r\n",Gyro.MaxAmp,(int)((((Gyro.MaxAmp - Gyro.AmpTarget) * Gyro.AmpSpeed)>>1)), Gyro.Amp>>16, Gyro.Amp);
+ WriteCon(Time);*/
}
@@ -306,11 +354,23 @@
{
switch(CountV31) {
case 0:
-
+ /* tempi++;
+ if( tempi>31)
+ {*/
+ sprintf((Time),"%d %d %d %d %d\r\n", (Gyro.AmpPerDel+Gyro.AmpT)*50,Gyro.CuruAngle32*500,(Buff_32Point[CountV31])*500, CaunAddPlus-3200, CaunAddMin-3200);
+ WriteCon(Time);
+ Gyro.CuruAngle32=0;
+ tempi=0;
+/* }
+
+ sprintf((Time)," %d %d\r\n",(Gyro.AmpPerDel+Gyro.AmpT),0);
+ WriteCon(Time);*/
+
Gyro.VibroAMPRegulF=1;
Time_vibro=0;
- Gyro.VibroNoiseF=1;//расчет и установка нового заначения частоты ошумления и запись в таймер частоты ошумления.
-
+ Gyro.VibroNoiseF++;//расчет и установка нового заначения частоты ошумления и запись в таймер частоты ошумления.
+ /* sprintf((Time),"%d\r\n",Gyro.AmpT);
+ WriteCon(Time);*/
break;
case 16:
@@ -318,39 +378,10 @@
Gyro.Reper_Event=1;
Time_vibro=0;
Gyro.VibroFrqRegulF=1; //
+ /*sprintf((Time),"%d\r\n",Gyro.AmpT);
+ WriteCon(Time);*/
break;
-
- case 31:
- /* for (int i = 0; i < 32; i++ )
- {
- Gyro.CuruAngle += Buff_32Point [i];
- Gyro.tempdelta += (Buff_Restored_sin[i]);
- Gyro.tempdelta2 += (Buff_Restored_sin2[i])
- }
- */
- if(Gyro.Log)
- {
- sprintf((Time),"%d %d %d\r\n",ADCDIF,(ADCDIF>>5),(ADCDIF>>10));
- WriteCon(Time);
- ADCDIF=0;
- Gyro.CuruAngle=0;
-
- } /*
- if(Gyro.ModJump==2) { ///прыжок с моды на моду. (-->)
- Gyro.ModJump=0;
- Spi.DAC_B += 4300;
- Gyro.PLC_Error2Mode=1;
- }
-
- if(Gyro.ModJump==1) { ///прыжок с моды на моду. (<--)
- Gyro.OldCuruAngle=Gyro.CuruAngle;
- Gyro.ModJump=0;
- Spi.DAC_B -= 5900;
- Gyro.PLC_Error2Mode=1;
- }
-
- break;*/
- }
+ }
}
void AllRegul (void)
{ ///////////////////////////контуры регулировки/////////////////////////////
@@ -373,7 +404,7 @@
if (Gyro.VibroFrqRegulF == 1) {Gyro.VibroFrqRegulF = 0; VibroFrqRegul(); } // Регулеровка частоты виброподвеса
if (Gyro.VibroAMPRegulF == 1) {Gyro.VibroAMPRegulF = 0; VibroAMPRegul(); } // Регулеровка Амплитуды виброподвеса
- if (Gyro.VibroNoiseF == 1) {Gyro.VibroNoiseF = 0; OLDCalcAmpN();}
+ if (Gyro.VibroNoiseF == 4) {Gyro.VibroNoiseF = 0; CalcAmpD();/*OLDCalcAmpN();*/}
/* {
switch(Gyro.flag) {
case 1: Gyro.VibroNoiseF = 0; OLDCalcAmpN(); break;
