⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 timer.c

📁 这是DSP2407的一个例子
💻 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 + -