📄 timer.c
字号:
#include"2407regs.h"
//v1[0][] MAX为5.5cm slow,c1=0.06,c2=0.74
//v1[1][] MAX为5.5cm fast
//v1[2][] MAX为8cm slow,c1=0.05,c2=1.23
//v1[3][] MAX为8cm fast
//v1[4][] MAX为10cm slow,c1=0.08,c2=1.46
//v1[5][] MAX为10cm fast,c1=0.08,c2=1.46
unsigned int v1[5][40]={{1954,1962,1967,1971,1972,1971,1967,1961,1953,1944,1932,1919,1905,1890,1874,1859,1844,1830,1817,1805,1795,1787,1782,1778,1777,1778,1782,1788,1796,1805,1817,1830,1844,1859,1875,1890,1905,1919,1932,1944},
{1957,1966,1971,1972,1969,1961,1950,1936,1919,1900,1879,1859,1839,1821,1805,1792,1783,1778,1777,1780,1788,1799,1813,1830,1849,1870,1890,1910,1928,1944},
{1974,1984,1991,1996,1997,1995,1991,1984,1974,1961,1947,1930,1912,1894,1874,1855,1836,1818,1802,1787,1775,1765,1758,1753,1752,1754,1758,1765,1775,1788,1802,1819,1837,1855,1875,1894,1913,1931,1947,1962},
{1978,1989,1996,1997,1993,1984,1970,1952,1930,1906,1881,1855,1830,1807,1787,1771,1760,1753,1752,1756,1765,1779,1797,1819,1843,1868,1894,1919,1942,1962},
{2005,2018,2028,2033,2035,2033,2027,2018,2005,1989,1970,1948,1924,1900,1874,1849,1824,1800,1779,1760,1744,1731,1721,1716,1714,1716,1722,1731,1744,1760,1779,1801,1825,1849,1875,1900,1925,1949,1970,1989},
/*{2010,2025,2033,2035,2030,2018,2000,1976,1948,1916,1883,1849,1816,1786,1760,1739,1724,1716,1714,1719,1731,1749,1773,1801,1833,1866,1900,1933,1963,1989},*/
};
unsigned int v2[5][40]={{2027,2046,2061,2072,2079,2080,2077,2068,2055,2037,2014,1988,1958,1927,1895,1862,1830,1799,1771,1745,1722,1703,1688,1677,1670,1669,1672,1681,1694,1712,1735,1761,1791,1822,1854,1887,1919,1950,1978,2004},
{2027,2051,2069,2079,2080,2072,2055,2029,1997,1958,1916,1873,1830,1790,1753,1722,1698,1680,1670,1669,1677,1694,1720,1752,1791,1833,1876,1919,1959,1996},
{2097,2120,2138,2150,2156,2156,2149,2134,2113,2084,2050,2011,1967,1922,1876,1831,1788,1748,1712,1679,1652,1629,1611,1599,1593,1593,1600,1615,1636,1665,1699,1738,1782,1827,1873,1918,1961,2001,2037,2070},
{2097,2127,2147,2156,2154,2140,2113,2073,2024,1967,1907,1846,1788,1736,1690,1652,1622,1602,1593,1595,1609,1636,1675,1725,1782,1842,1903,1961,2013,2059},
{2138,2167,2191,2209,2219,2222,2217,2203,2179,2147,2105,2057,2003,1947,1889,1833,1780,1731,1686,1646,1611,1582,1558,1540,1530,1527,1532,1546,1570,1602,1644,1692,1746,1802,1860,1916,1969,2018,2063,2103},
/*{2138,2176,2203,2219,2222,2209,2179,2134,2074,2003,1928,1852,1780,1716,1659,1611,1573,1546,1530,1527,1540,1570,1615,1675,1746,1821,1897,1969,2033,2090},*/
};
unsigned int v3[5][40]={{1900,1922,1944,1966,1988,2010,2032,2054,2075,2086,2092,2070,2045,2020,1995,1970,1945,1920,1895,1870,1845,1820,1795,1770,1745,1720,1700,1684,1672,1658,1680,1702,1724,1746,1768,1790,1812,1834,1856,1878},
{1885,1920,1945,1975,2000,2022,2048,2072,2092,2087,2072,2045,2007,1961,1910,1860,1814,1774,1740,1712,1680,1657,1667,1697,1720,1743,1766,1790,1814,1839},
{1860,1890,1920,1950,1980,2015,2050,2085,2120,2150,2175,2189,2180,2175,2152,2117,2070,2015,1956,1896,1841,1791,1749,1712,1681,1655,1632,1611,1593,1578,1560,1590,1620,1650,1680,1710,1740,1770,1805,1840},
{1860,1890,1920,1950,1980,2010,2040,2075,2110,2145,2180,2130,2070,1996,1916,1841,1776,1724,1681,1647,1618,1593,1573,1561,1562,1580,1619,1710,1783,1833},
{1917,1973,2018,2055,2084,2110,2132,2154,2175,2195,2213,2226,2232,2227,2206,2168,2113,2045,1971,1898,1832,1776,1731,1694,1665,1639,1617,1595,1574,1554,1536,1523,1517,1522,1543,1581,1636,1704,1778,1851},
/*{1917,1989,2043,2084,2117,2147,2175,2201,2222,2232,2222,2183,2113,2021,1922,1832,1760,1706,1665,1632,1602,1574,1548,1527,1517,1527,1566,1636,1728,1827},*/
};
unsigned int v4[5][40]={{1513,1506,1509,1523,1546,1577,1614,1657,1704,1754,1805,1858,1911,1964,2016,2067,2114,2156,2191,2219,2236,2243,2240,2226,2203,2172,2135,2092,2045,1996,1944,1891,1838,1785,1733,1683,1635,1593,1558,1530},
{1513,1506,1517,1546,1589,1642,1704,1771,1840,1911,1982,2050,2114,2169,2211,2236,2243,2232,2203,2160,2107,2045,1979,1909,1838,1767,1699,1635,1580,1538},
{1422,1397,1387,1392,1410,1438,1475,1518,1567,1620,1677,1738,1802,1870,1942,2016,2092,2164,2231,2286,2327,2352,2362,2357,2339,2311,2274,2231,2182,2129,2072,2011,1947,1879,1807,1733,1657,1585,1518,1463},
{1422,1392,1389,1410,1449,1503,1567,1639,1717,1802,1894,1991,2092,2187,2269,2327,2357,2360,2339,2300,2246,2182,2110,2032,1947,1855,1758,1657,1562,1480},
{1373,1335,1317,1316,1330,1356,1391,1434,1482,1535,1592,1654,1721,1794,1875,1963,2057,2152,2241,2317,2376,2414,2432,2433,2419,2393,2358,2316,2267,2214,2157,2095,2028,1955,1874,1786,1692,1597,1508,1432},
/*{1373,1327,1315,1330,1367,1419,1482,1553,1633,1721,1820,1933,2057,2183,2294,2376,2422,2434,2419,2382,2330,2267,2196,2116,2028,1929,1816,1692,1566,1455},*/
};
int speed[3]={0,1,2}; //数字越大,速度就越慢
int swimmode[20]={0,2,3,14,13,0,1,9,10,2,3,15,0,1,3,0,13,2,9,10};
int num123=0,num4=0,rate; //rate取0或1或2或3,数字小时摆幅较小,数字大时摆幅较大
int mode,s,adflag=0,swimtime; //s为速度的快慢
int slowa=1,slowb=1,turning,oncount=0,backv=20,on_temp,on_off;
void interrupt timer(){
//速度的选择(摆幅和速度大小)
switch(mode){
case 0: {rate=2;s=1;swimtime--;adflag=0;}break;//此时机器鱼前进,小摆幅,慢速,8cm
case 1: {rate=0;s=1;swimtime--;adflag=0;}break;//此时机器鱼前进,小摆幅,快速,8cm
case 2: {rate=1;s=1;swimtime--;adflag=0;}break;//此时机器鱼前进,大摆幅,慢速,5cm
case 3: {rate=3;s=1;swimtime--;adflag=0;}break;//此时机器鱼前进,大摆幅,快速,5cm
case 4: {rate=3;
s=0;
adflag++;
if(adflag==100) adflag=200;//adflag为计时变量,转弯后慢慢伸直
}break;//此时机器鱼左转弯,固定C形转弯, 2s时间
case 5: {rate=3;s=1;swimtime--;if(swimtime==0)adflag=0;}break;//此时机器鱼左转弯,开口变化的C形转弯
case 6: {rate=3;
s=0;
adflag++;
if(adflag==100) adflag=200;//adflag为计时变量,转弯后慢慢伸直
}break;//此时机器鱼右转弯,固定C形转弯 ,2s时间
case 7: {rate=3;s=1;swimtime--;if(swimtime==0)adflag=0;}break;//此时机器鱼右转弯,开口变化的C形转弯
case 8: {rate=0;slowa=slowb=1;s=0;adflag=0;}break;//此时让舵机停止运动,但有输出
case 9: {rate=3;
slowa=slowb=0;
swimtime=-1;
adflag++;
if(adflag>255) adflag=0;//转弯后慢慢伸直
}break;//此时让舵机停止在中间位置
case 10: {
// oncount++;
// if(oncount==10) {on_off=0;mode=11;}
/* if(on_temp==0) {on_off=1;oncount=0;}//开机
else {
on_off=0;
oncount=0;
mode=9;
}
}*/
swimtime--;
slowa=slowb=1;
CMPR1=CMPR2=CMPR3=CMPR4=CMPR5=CMPR6=0;
// adflag=0;
}break;//此时舵机不工作
case 11: {slowa=slowb=1;swimtime--;CMPR1=CMPR2=CMPR3=CMPR4=CMPR5=CMPR6=1875;}break;//此时让舵机不工作
case 12: {slowa=slowb=1;CMPR1=CMPR2=CMPR3=CMPR4=CMPR5=CMPR6=0;}break;//此时让舵机不工作
case 13: {rate=4;s=0;swimtime--;adflag=0;}break;//此时机器鱼前进,大摆幅,慢速,10cm
case 14: {rate=4;s=0;swimtime--;adflag=0;}break;//此时机器鱼前进,大摆幅,10cm,只有最后一个电机摆动
case 15: {rate=3;s=0;swimtime--;adflag=0;}break;//此时机器鱼前进,大摆幅,8cm,最后两个电机摆动
default: break;
}
switch(PIVR){
case 0x27:
{
//以下有slowa/b两个变量,分别用来控制四个舵机的速度等级
slowa--;
if(slowa>=0) {EVAIFRA=0x0080;return;}
slowa=speed[s];
switch(rate){
case 0:
if(num123==39) num123=0;
break;
case 1:
if(num123>=29) num123=0;
break;
case 2:
if(num123==39) num123=0;
break;
case 3:
if(num123>=29) num123=0;
break;
case 4:
if(num123>=39) num123=0;
break;
default:break;
}
//第一个舵机速度的调节(5度/70)
if(mode==4) CMPR1=CMPR5=1875+420; //左转弯,30度
else if(mode==5) CMPR1=CMPR5=1875+140; //左转弯,偏置10度
else if(mode==6) CMPR1=CMPR5=1875-420; //右转弯,30度
else if(mode==7) CMPR1=CMPR5=1875-140; //右转弯,偏置10度
else if(mode==14||mode==15) CMPR1=CMPR5=1875;
else if(mode==9)
{
turning=CMPR1-1875; //从中间回到初始位置时的左右判断
if(turning>backv) CMPR1=CMPR1-backv;
else if(turning<-backv) CMPR1=CMPR1+backv;//缓慢回到中间
else CMPR1=1875;
}
else CMPR1=CMPR5=v1[rate][num123];
//第二个舵机速度的调节
if(mode==4) CMPR2=1875-700; //左转弯,45度
else if(mode==5) CMPR2=1875-280; //左转弯,偏置20度
else if(mode==6) CMPR2=1875+700; //右转弯,45度
else if(mode==7) CMPR2=1875+280; //右转弯,偏置20度
else if(mode==14||mode==15) CMPR2=1875;
else if(mode==9)
{
turning=CMPR2-1875; //从中间回到初始位置时的左右判断
if(turning>backv) CMPR2=CMPR2-backv;
else if(turning<-backv) CMPR2=CMPR2+backv;//缓慢回到中间
else CMPR2=1875;
}
else CMPR2=v2[rate][num123];
//第三个舵机速度的调节
if(mode==4) CMPR3=1875-630; //左转弯,45度
else if(mode==5) CMPR3=v3[rate][num123]-280; //左转弯,偏置20度
else if(mode==6) CMPR3=1875+630; //右转弯,45度
else if(mode==7) CMPR3=v3[rate][num123]+280; //右转弯,偏置20度
else if(mode==14) CMPR3=1875;
else if(mode==9)
{
turning=CMPR3-1875; //从中间回到初始位置时的左右判断
if(turning>backv) CMPR3=CMPR3-backv;
else if(turning<-backv) CMPR3=CMPR3+backv;//缓慢回到中间
else CMPR3=1875;
}
else CMPR3=v3[rate][num123];
num123++;
EVAIFRA=0x0080; //清除IFR中相应的中断标志
}break;//case 0x27
case 0x2F:{
slowb--;
if(slowb>=0) {EVBIFRA=0x0080;return;}
slowb=speed[s];
//第四个舵机速度的调节
num4=num123;
switch(rate){
case 0:
if(num4==39) num4=0;
break;
case 1:
if(num4>=29) num4=0;
break;
case 2:
if(num4==39) num4=0;
break;
case 3:
if(num4>=29) num4=0;
break;
case 4:
if(num4>=39) num4=0;
break;
default:break;
} //使四个舵机同步
if(mode==4) CMPR4=CMPR6=1200; //左转45度
else if(mode==5) CMPR4=CMPR6=v4[rate][num4]-420; //左转弯,偏置30度
else if(mode==6) CMPR4=CMPR6=2550; //右转45
else if(mode==7) CMPR4=CMPR6=v4[rate][num4]+420; //右转弯,偏置30度
else if(mode==9)
{
turning=CMPR4-1875; //从中间回到初始位置时的左右判断
if(turning>backv) CMPR4=CMPR4-backv;
else if(turning<-backv) CMPR4=CMPR4+backv;//缓慢回到中间
else CMPR4=1875;
}
else
CMPR4=CMPR6=v4[rate][num4];
num4++;
EVBIFRA=0x0080; //清除EV模块IFR中相应的中断标志
}break; //case 0x2F
default:break;
}
enable(); //开总中断(因为当进入中断服务程序时总中断就会自动关闭)
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -