dlia.c
上传用户:inhuatv111
上传日期:2022-08-04
资源大小:292k
文件大小:6k
源码类别:

DSP编程

开发平台:

C/C++

  1. /*************************************************************************
  2. 文件名: main10_1.c
  3. 日期:       2007年2月9日
  4. 公司(作者):  
  5. 描述和说明: main()函数中启动定时器1
  6. *************************************************************************/
  7. #include "regs2407.h"
  8. #include "Initializing.h"
  9. //#define NN 32
  10. //#define QQ 15
  11. #define NN 32
  12. #define QQ 4
  13. ioport unsigned port2000;//访问IO端口0X2000的变量
  14. #define LEDSPORT port2000
  15. const signed int Sin_Tab[32]=
  16. {0x0000,0x018F,0x030F,0x0471,0x05A7,0x06A6,0x0763,0x07D8,0x07FF,0x07D8,
  17. 0x0763,0x06A6,0x05A7,0x0471,0x030F,0x018F,0x0000,0xFE72,0xFCF2,0xFB90,
  18. 0xFA5A,0xF95B,0xF89E,0xF829,0xF802,0xF829,0xF89E,0xF95B,0xFA5A,0xFB90,
  19. 0xFCF2,0xFE72};
  20. const signed int Cos_Tab[32]=
  21. {0x07FF,0x07D8,0x0763,0x06A6,0x05A7,0x0471,0x030F,0x018F,0x0000,0xFE72,
  22. 0xFCF2,0xFB90,0xFA5A,0xF95B,0xF89E,0xF829,0xF802,0xF829,0xF89E,0xF95B,
  23. 0xFA5A,0xFB90,0xFCF2,0xFE72,0x0000,0x018F,0x030F,0x0471,0x05A7,0x06A6,
  24. 0x0763,0x07D8};
  25. const signed int t_Tab[128]=
  26. {0x05A7,0x0471,0x030F,0x018F,0x0000,0xFE72,0xFCF2,0xFB90,
  27. 0xFA5A,0xF95B,0xF89E,0xF829,0xF802,0xF829,0xF89E,0xF95B,0xFA5A,0xFB90,
  28. 0xFCF2,0xFE72,
  29. 0x0000,0x018F,0x030F,0x0471,0x05A7,0x06A6,0x0763,0x07D8,0x07FF,0x07D8,
  30. 0x0763,0x06A6,0x05A7,0x0471,0x030F,0x018F,0x0000,0xFE72,0xFCF2,0xFB90,
  31. 0xFA5A,0xF95B,0xF89E,0xF829,0xF802,0xF829,0xF89E,0xF95B,0xFA5A,0xFB90,
  32. 0xFCF2,0xFE72,
  33. 0x0000,0x018F,0x030F,0x0471,0x05A7,0x06A6,0x0763,0x07D8,0x07FF,0x07D8,
  34. 0x0763,0x06A6,0x05A7,0x0471,0x030F,0x018F,0x0000,0xFE72,0xFCF2,0xFB90,
  35. 0xFA5A,0xF95B,0xF89E,0xF829,0xF802,0xF829,0xF89E,0xF95B,0xFA5A,0xFB90,
  36. 0xFCF2,0xFE72,
  37. 0x0000,0x018F,0x030F,0x0471,0x05A7,0x06A6,0x0763,0x07D8,0x07FF,0x07D8,
  38. 0x0763,0x06A6,0x05A7,0x0471,0x030F,0x018F,0x0000,0xFE72,0xFCF2,0xFB90,
  39. 0xFA5A,0xF95B,0xF89E,0xF829,0xF802,0xF829,0xF89E,0xF95B,0xFA5A,0xFB90,
  40. 0xFCF2,0xFE72,
  41. 0x0000,0x018F,0x030F,0x0471,0x05A7,0x06A6,0x0763,0x07D8,0x07FF,0x07D8,
  42. 0x0763,0x06A6,
  43. };
  44. unsigned int t1_count=0; // 全局变量,用于定时器中断计数
  45. unsigned int count_flag=0;  //
  46. extern signed int U_data_in[640]; // 40个周波AD采样数据,为16位2的补码
  47. long offsettemp, temp1=0, temp2=0;
  48. //extern signed int U_data_out[320]; // 40个周波AD采样数据,为16位2的补码
  49. void delay()//1 sec
  50. {
  51. unsigned int i, j;
  52. for (i=0; i<200; i++)
  53.     for (j=0; j<1000; j++);
  54. }
  55. unsigned int search_offset(signed int *U_data)
  56. {
  57. signed int i,j;
  58. unsigned int index=0;
  59. signed int buff[6];
  60. signed int min=1000;
  61. min=1000;
  62. for (i=0; i<96; i=i+6)
  63. {
  64. buff[0] = U_data[i];
  65. buff[1] = U_data[i+1];
  66. buff[2] = U_data[i+2];
  67. buff[3] = U_data[i+3];
  68. buff[4] = U_data[i+4];
  69. buff[5] = U_data[i+5];
  70. if ((buff[0]<=0)  && (buff[5]>=0))//判断数据是否由负变正
  71. {
  72. //if (/*(buff[4]>0) && */(buff[5]>=0))
  73. //{
  74. if(buff[0]<0)
  75. {
  76. buff[0] = 0 - buff[0];
  77. }
  78. if(buff[1]<0)
  79. {
  80. buff[1] = 0 - buff[1];
  81. }
  82. if(buff[2]<0)
  83. {
  84. buff[2] = 0 - buff[2];
  85. }
  86. if(buff[3]<0)
  87. {
  88. buff[3] = 0 - buff[3];
  89. }
  90. if(buff[4]<0)
  91. {
  92. buff[4] = 0 - buff[4];
  93. }
  94. if(buff[5]<0)
  95. {
  96. buff[5] = 0 - buff[5];
  97. }
  98.     for (j=0; j<6; j++)
  99. {
  100. if (buff[j]<min)
  101. {
  102. min = buff[j];
  103. }
  104. }
  105. for (j=0; j<6; j++)
  106. {
  107. if (buff[j] == min)
  108. {
  109. //temp = i+j;
  110. return (i+j);
  111. }
  112. }
  113. //}
  114. }
  115. }
  116. return index;
  117. }
  118. /*if(buff[1]<buff[2])//比较哪个数据最接近零
  119. {
  120. //index = i+1;
  121.  if(buff[3]<buff[4])//比较哪个数据最接近零
  122. {
  123. //index = i+3;
  124. if(buff[1]<buff[3]) 
  125. {
  126. index = i+1;//buff[1]最小
  127. }
  128. else
  129. {
  130. index = i+3;//buff[3]最小
  131. }
  132. //return index;
  133. }
  134. else
  135. {
  136. //index = i+4;
  137. if(buff[1]<buff[4]) 
  138. {
  139. index = i+1;//buff[1]最小
  140. }
  141. else
  142. {
  143. index = i+4;//buff[4]最小
  144. }
  145. //return index;
  146. }
  147. return index;
  148. }
  149. else
  150. {
  151. //index = i+2;
  152. if(buff[3]<buff[4])
  153. {
  154. if(buff[2]<buff[3])
  155. {
  156. index = i+2;//buff[2]最小
  157. }
  158. else
  159. {
  160. index = i+3;//buff[3]最小
  161. }
  162. //return index;
  163. }
  164. else
  165. {
  166. if(buff[2]<buff[4])
  167. {
  168. index = i+2;//buff[2]最小
  169. }
  170. else
  171. {
  172. index = i+4;//buff[4]最小
  173. }
  174. //return index;
  175. }
  176. return index;
  177. }*/
  178. long sor_caculation(const signed int *U_data, const signed int *C_data, unsigned int offset)
  179. //long sor_caculation(signed int *U_data, const signed int *C_data, unsigned int offset)
  180. {
  181. unsigned int i, j;
  182. long sum1 = 0, sum2;
  183. // sum1 = 0;
  184. for (i=0; i<NN; i++)//一週期採樣點數
  185. {
  186. sum2 = 0;
  187. for(j=0; j<QQ; j++)//15周期
  188. {
  189. sum2 = sum2 + U_data[j*32 + i + offset];
  190. }
  191. sum2 = sum2 * C_data[i];
  192. // sum2 = sum2 / 480 ;
  193. sum1 += sum2;
  194. }
  195. return sum1;
  196. }
  197. void main(void)
  198. {   
  199. //unsigned int i;
  200. DSP2407_Initializing();  // DSP2407芯片初始化
  201. IOPort_Initializing();  // 数字IO端口初始化
  202. Timer1_Initializing(); // 定时器1初始化
  203. Sampling_Initializing(); // AD7862初始化
  204.     asm(" CLRC INTM"); // 允许总中断
  205. LEDSPORT = 0xff;
  206. LEDSPORT = 0x00;
  207. PCDATDIR = 0xFF00;//test
  208. PCDATDIR = 0xFFff;//test
  209. PCDATDIR = 0xFF00;//test
  210. if(PCDATDIR == 0xffff)
  211. {
  212. PCDATDIR = 0xff00;
  213. }
  214.    else
  215.    {
  216.     PCDATDIR = 0xffff;
  217.    }
  218.    if(PCDATDIR == 0xffff)
  219. {
  220. PCDATDIR = 0xff00;
  221. }
  222.    else
  223.    {
  224.     PCDATDIR = 0xffff;
  225.    }
  226. PCDATDIR = 0xFFff;//test
  227. LEDSPORT = 0xff;
  228. T1CON=T1CON|0x0040; // 位6[TENABLE]1: 启动Timer1 
  229. while(1)     // 主循环,可分配非实时性任务
  230. {
  231. //temp = sor_caculation(U_data_in, t_Tab); 
  232.  asm(" nop "); // 空操作,等待中断
  233.  if(count_flag)
  234.  {
  235.    count_flag = 0;
  236.  asm(" setc INTM"); // 禁止总中断
  237.  offsettemp = search_offset(U_data_in);
  238.  offsettemp = 0;
  239.              temp1 = sor_caculation(t_Tab, Sin_Tab, offsettemp);
  240.  temp2 = sor_caculation(t_Tab, Cos_Tab, offsettemp);
  241.  //delay();
  242.  //delay();
  243.  //delay();
  244.  //delay();
  245.  asm(" CLRC INTM"); // 允许总中断
  246.  }
  247. }   
  248. }