Motor.c 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  1. #define __MOTOR1_DEF
  2. #include "ABIS_User.h"
  3. #define MAX_SETP_OF_X 500000
  4. #define MAX_SETP_OF_X_LEAVEOPT 100000
  5. /*******************************************************************************
  6. * 函数名称:CalculateSModeLine
  7. *******************************************************************************/
  8. void CalculateSModeLineX( unsigned int * period, unsigned int len, unsigned int fre_max, unsigned int fre_min, float flexible)
  9. {
  10. int i,ttt;
  11. float deno ;
  12. float melo ;
  13. float fre;
  14. float Fdelt = fre_max-fre_min;
  15. if(len>MOTORX_ACCLTH) len=MOTORX_ACCLTH;
  16. for(i=0; i<len; i++){
  17. melo = flexible * (2.0*i/len-1);
  18. deno = 1.0 / (1 + expf(-melo));
  19. fre = Fdelt * deno + fre_min;
  20. ttt=period[i] = (unsigned short)(625000.0/fre);
  21. }
  22. }
  23. /*******************************************************************************
  24. * 函数名称:InitMotorPWM
  25. *******************************************************************************/
  26. void InitMotorXPWM(void){
  27. _RP100R = 0x10;
  28. OC1CON2 = 0;
  29. OC1CON1bits.OCTSEL = 0;
  30. OC1R = 15000;
  31. OC1RS = 15000;
  32. T2CON = 0;
  33. T2CONbits.TCKPS = 2;
  34. PR2 = 30000;
  35. OC1CON2bits.SYNCSEL = 0x0C;
  36. OC1CON1bits.OCM = 5;
  37. T2CONbits.TON = 0;
  38. IEC0bits.T2IE = 1;
  39. IFS0bits.T2IF = 0;
  40. IPC1bits.T2IP = 7;
  41. }
  42. /*******************************************************************************
  43. * 函数名称:SetMotor
  44. *******************************************************************************/
  45. void SetMotorX(unsigned long int Pulses,unsigned int spd,unsigned long int *AccPLS,unsigned long int *constVPLS)
  46. {
  47. unsigned int i;
  48. unsigned int Prd;
  49. Prd = 625000 / spd;
  50. for (i = 0; i < MOTORX_ACC; i++) {
  51. if ((Prd < g_uiMotorXPeriod[i])&&(Prd >= g_uiMotorXPeriod[i + 1])) {
  52. *AccPLS = i + 1;
  53. break;
  54. } else if (Prd == g_uiMotorXPeriod[i]) {
  55. *AccPLS = i;
  56. break;
  57. }
  58. }
  59. if (Pulses >= *AccPLS + *AccPLS) {
  60. *constVPLS = Pulses - *AccPLS;
  61. } else if (Pulses < *AccPLS + *AccPLS) {
  62. *AccPLS = Pulses / 2;
  63. *constVPLS = *AccPLS;
  64. }
  65. }
  66. /*******************************************************************************
  67. * 函数名称:MotorHome
  68. *******************************************************************************/
  69. unsigned int MotorXHome(unsigned int pulseoffset,unsigned int MOVEspd,unsigned int LEAVspd )
  70. {
  71. unsigned int Freq;
  72. OC1CON1 = 0;
  73. MotorXHomebuffer = 1;
  74. MotorYHomebuffer = 0;
  75. MotorZHomebuffer = 0;
  76. Delay_ms(2);
  77. TMR8=0;
  78. PulseNum=0;
  79. if(HOMEX == 0){
  80. MOTORX_DIR = FORWARD;
  81. Freq=5000000/LEAVspd;
  82. TMR8=0;
  83. PR8=Freq;
  84. IFS3bits.T8IF = 0;
  85. T8CONbits.TON=1;
  86. while(!HOMEX){
  87. if(PulseNum > MAX_SETP_OF_X_LEAVEOPT)
  88. T8CONbits.TON=0;
  89. return 0;
  90. }
  91. T8CONbits.TON=0;
  92. MOTORX_PWM=0;
  93. }else{
  94. MOTORX_DIR = REVERSAL;
  95. Freq=5000000/MOVEspd;
  96. TMR8=0;
  97. PR8=Freq;
  98. IFS3bits.T8IF = 0;
  99. T8CONbits.TON=1;
  100. while(1){
  101. if(!HOMEX)
  102. break;
  103. if(PulseNum >= MAX_SETP_OF_X){
  104. T8CONbits.TON=0;
  105. return 0;
  106. }
  107. }
  108. T8CONbits.TON=0;
  109. Freq=5000000/LEAVspd;
  110. TMR8=0;
  111. PR8=Freq;
  112. IFS3bits.T8IF = 0;
  113. T8CONbits.TON=1;
  114. PulseNum=0;
  115. while(PulseNum <= g_tEE.uiXPulseHome * 2);
  116. T8CONbits.TON=0;
  117. MOTORX_DIR = FORWARD;
  118. Freq=5000000/LEAVspd;
  119. TMR8=0;
  120. PR8=Freq;
  121. IFS3bits.T8IF = 0;
  122. T8CONbits.TON=1;
  123. PulseNum=0;
  124. while(HOMEX==0){
  125. if(PulseNum >= MAX_SETP_OF_X_LEAVEOPT) {
  126. T8CONbits.TON=0;
  127. return 0;
  128. }
  129. }
  130. T8CONbits.TON=0;
  131. MOTORX_PWM=0;
  132. }
  133. InitMotorXPWM(); //电机OC初始化
  134. g_uliRunningPulse = 0;
  135. g_uiScanPulseX = 0;
  136. g_tMotorParam.ulXiPosition =0;
  137. Delay_ms(10);
  138. return 1;
  139. }
  140. /*******************************************************************************
  141. * 函数名称:MotorXMoveTo 暂时没有调用
  142. *******************************************************************************/
  143. void MotorXMoveTo(unsigned long int pulse,unsigned int spd)
  144. {
  145. unsigned long int uliMotorPulse = 0;
  146. if(pulse > g_tMotorParam.ulXiPosition)
  147. {
  148. uliMotorPulse = pulse - g_tMotorParam.ulXiPosition;
  149. MotorXMove(uliMotorPulse,1,spd);
  150. }
  151. else if(pulse < g_tMotorParam.ulXiPosition)
  152. {
  153. uliMotorPulse = g_tMotorParam.ulXiPosition - pulse;
  154. MotorXMove(uliMotorPulse,0,spd);
  155. }
  156. }
  157. /*******************************************************************************
  158. * 函数名称:MotorXMove
  159. *******************************************************************************/
  160. void MotorXMove(unsigned long int pulse,unsigned char dir,unsigned int spd)//spd --HZ
  161. {
  162. if(pulse ==0) return;
  163. g_tMotorParam.ucXDirection = dir;
  164. MOTORX_DIR = dir;
  165. if(spd < g_tEE.uiXSpeedMin)spd = g_tEE.uiXSpeedMin;
  166. if(spd > g_tEE.uiXSpeedMax)spd = g_tEE.uiXSpeedMax;
  167. g_uiAccIndex=0;
  168. g_uliRunningPulse=0;
  169. g_ucMotorXFinishFlag = 0;
  170. g_uliPulseCount = pulse;
  171. SetMotorX(pulse,spd,&(g_tMotorParam.ulXiAccPulse),&(g_tMotorParam.ulXiConstPulse));
  172. T2CONbits.TON=1;//on the T1
  173. while(!g_ucMotorXFinishFlag);
  174. }
  175. /*******************************************************************************
  176. * 函数名称:MotorXScan
  177. *******************************************************************************/
  178. void MotorXScan(unsigned long int pulse,unsigned char dir,unsigned int spd)//spd --HZ
  179. {
  180. if(pulse ==0) return;
  181. MOTORX_DIR = dir;//close to the home sensor
  182. MOTORX_DIR_scan = dir;
  183. g_tMotorParam.ucXDirection = dir;
  184. if(Alldata==1){
  185. g_ucFAMLED = 1;
  186. g_ucVICLED = 1;
  187. g_ucROXLED = 1;
  188. g_ucCY5LED = 1;
  189. g_ucCY6LED = 1;
  190. g_uc390LED = 1;
  191. ADC7606Enable = 1;
  192. FAMData_num = 0;
  193. VICData_num = 0;
  194. ROXData_num = 0;
  195. CY5Data_num = 0;
  196. CY6Data_num = 0;
  197. _390Data_num = 0;
  198. TEMP_num = 0;
  199. }else{
  200. if(FAMLED == 1) MPPCnum = 0;
  201. else if(VICLED == 1) MPPCnum = 1;
  202. else if(ROXLED == 1) MPPCnum = 2;
  203. else if(CY5LED == 1) MPPCnum = 3;
  204. else if(CY6LED == 1) MPPCnum = 4;
  205. else if(_390LED == 1)MPPCnum = 5;
  206. Motstep = 0;
  207. FAMData_num = 3;
  208. }
  209. if(spd<g_tEE.uiXSpeedMin) spd=g_tEE.uiXSpeedMin;
  210. g_uiAccIndex = 0;
  211. g_uliRunningPulse = 0;
  212. g_ucMotorXFinishFlag = 0;
  213. g_uliPulseCount = pulse;
  214. SetMotorX(pulse,spd,&(g_tMotorParam.ulXiAccPulse),&(g_tMotorParam.ulXiConstPulse));
  215. T2CONbits.TON=1;//on the T1
  216. while(!g_ucMotorXFinishFlag);
  217. }