训练营PLSR题目
選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

239 行
4.9 KiB

  1. #include "PLSR.h"
  2. #include "PSCARR.h"
  3. #include "tim.h"
  4. #include "sram.h"
  5. #include <string.h>
  6. #include "modbus.h"
  7. Pulse PulseOutput[10]; // 十段脉冲的配置
  8. Option Options;
  9. uint8_t NowPulse; /* 当前处于第几段脉冲 */
  10. uint8_t PrePulse; /* 之前处于第几段脉冲 */
  11. uint8_t PulseNum; /* 一共有多少段脉冲 */
  12. int32_t MAX_Pulse; /* 最多的脉冲数 */
  13. int32_t AccCount; /* 加速脉冲数 */
  14. int32_t NowMAXPulse; /* 当前要达到的总脉冲 */
  15. int32_t PulseCount = 0;
  16. /**
  17. * @brief 根据脉冲的频率设置对应的PSC和ARR
  18. * @param[in] SentPost 脉冲通道(目前只有通道Y0)
  19. * @param[in] Ferquency 脉冲的频率
  20. * @return 无
  21. */
  22. void SetFrequency(uint8_t SentPost, uint32_t Frequency)
  23. {
  24. Frequency_Change_PSC_And_ARR(Frequency, &psc, &arr);
  25. switch(SentPost)
  26. {
  27. case 0: TIM10->ARR = arr, TIM10->PSC = psc, TIM10->CCR1 = arr / 2; break;
  28. }
  29. }
  30. /**
  31. * @brief 设置脉冲基本参数
  32. * @param[in] Pulse 第几段脉冲
  33. * @param[in] Ferquency 脉冲的频率
  34. * @param[in] Count 脉冲的数量
  35. * @param[in] EXT EXT信号
  36. * @param[in] NextPulse 下一段脉冲
  37. * @return 无
  38. */
  39. void SetPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, uint8_t EXT, int8_t NextPulse)
  40. {
  41. PulseOutput[Pulse].Frequency = Ferquency;
  42. PulseOutput[Pulse].PulseCount = Count;
  43. PulseOutput[Pulse].EXT = EXT;
  44. PulseOutput[Pulse].NextPulse = NextPulse;
  45. }
  46. /**
  47. * @brief 脉冲初始化
  48. * @param[in] StartPulse 起始脉冲段
  49. * @param[in] PulseMod 绝对1/相对0
  50. * @return 无
  51. */
  52. void PulseBaseInit(uint8_t StartPulse, uint8_t PulseMod, int32_t MAX_Pulse)
  53. {
  54. Options.StartPulse = StartPulse;
  55. Options.RunMod = PulseMod;
  56. NowPulse = StartPulse;
  57. MAX_Pulse = MAX_Pulse;
  58. }
  59. void PulseStart(void)
  60. {
  61. SetFrequency(Options.DirPost, PulseOutput[NowPulse].Frequency);
  62. TIM2->ARR = PulseOutput[NowPulse].PulseCount;
  63. HAL_TIM_PWM_Start_IT(&htim10, TIM_CHANNEL_1);
  64. }
  65. /**
  66. * @brief 获取加速度
  67. * @param[in] Start 起始脉冲频率
  68. * @param[in] End 目标脉冲频率
  69. * @param[in] AccCount 需要多少个脉冲完成加速
  70. * @return 加速度
  71. */
  72. float GetAcc(int32_t Start, int32_t End, int32_t AccCount)
  73. {
  74. return ((float)End - (float)Start) / (float)AccCount;
  75. }
  76. /**
  77. * @brief 添加新的脉冲(只允许按顺序添加)
  78. * @param[in] Pulse 第几段脉冲
  79. * @param[in] Ferquency 脉冲的频率
  80. * @param[in] Count 脉冲的数量
  81. * @param[in] NextPulse 下一段脉冲
  82. * @return 无
  83. */
  84. void AddPulse(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse)
  85. {
  86. if(Pulse == Options.AllPulse)
  87. {
  88. if(Count > 0)
  89. {
  90. SetPulse(Pulse, Ferquency, Count, 0, NextPulse);
  91. }
  92. else
  93. {
  94. SetPulse(Pulse, Ferquency, -Count, 1, NextPulse);
  95. }
  96. Options.AllPulse ++;
  97. }
  98. }
  99. /**
  100. * @brief 脉冲初始化
  101. * @param[in] Pulse 第几段脉冲
  102. * @param[in] Ferquency 脉冲的频率
  103. * @param[in] Count 脉冲的数量
  104. * @param[in] Direction 脉冲的方向
  105. * @param[in] NextPulse 下一段脉冲
  106. * @return 无
  107. */
  108. void PulseInit(uint8_t Pulse, uint32_t Ferquency, int32_t Count, int8_t NextPulse)
  109. {
  110. if(Count > 0)
  111. {
  112. SetPulse(Pulse, Ferquency, Count, 0, NextPulse);
  113. }
  114. else
  115. {
  116. SetPulse(Pulse, Ferquency, -Count, 1, NextPulse);
  117. }
  118. Options.AllPulse = 1;
  119. }
  120. /**
  121. * @brief 设置结果脉冲数
  122. * @param[in] PulseCount 要设定的脉冲数
  123. * @return 无
  124. */
  125. void MAXPulseSet(int32_t PulseCount)
  126. {
  127. if(NowPulse == 0)
  128. {
  129. NowMAXPulse = PulseOutput[NowPulse].PulseCount;
  130. }
  131. else
  132. {
  133. NowMAXPulse += PulseOutput[NowPulse].PulseCount;
  134. }
  135. }
  136. /**
  137. * @brief 设置下一次进入中断的脉冲数
  138. * @return 无
  139. */
  140. void SetNextPulse(void)
  141. {
  142. MAXPulseSet(PulseOutput[NowPulse].PulseCount); /* 更改结果脉冲数 */
  143. if(Options.RunMod == 0) /* 如果是相对模式 */
  144. {
  145. TIM2->ARR = PulseOutput[NowPulse].PulseCount;
  146. }
  147. else /* 如果是绝对模式 */
  148. {
  149. if(NowMAXPulse >= MAX_Pulse) /* 如果超出了上限 */
  150. {
  151. TIM2->ARR = - (MAX_Pulse - NowMAXPulse);
  152. }
  153. else
  154. {
  155. TIM2->ARR = PulseOutput[NowPulse].PulseCount;
  156. }
  157. }
  158. }
  159. /**
  160. * @brief 获取与CNT相加的基础值
  161. * @param[in] NowPulseNUM 当前的脉冲段数
  162. * @return 基础值
  163. */
  164. uint32_t GetBase(uint8_t NowPulseNUM)
  165. {
  166. uint32_t temp = 0;
  167. if(NowPulseNUM == 0)
  168. {
  169. temp = 0;
  170. }
  171. else
  172. {
  173. for(int i = 0; i < NowPulseNUM; i++)
  174. {
  175. temp += PulseOutput[i].PulseCount;
  176. }
  177. }
  178. return temp;
  179. }
  180. /**
  181. * @brief 数据掉电保存
  182. * @return 无
  183. */
  184. void PLSRSramSave(void)
  185. {
  186. uint32_t temp[80] = {0}; //一共4 * 80 = 320
  187. Write_Backup_SRAM(temp, 80);
  188. }
  189. /**
  190. * @brief 数据上电读取
  191. * @return 无
  192. */
  193. void PLSRSramRead(void)
  194. {
  195. uint32_t temp[80] = {0};
  196. Read_Backup_SRAM(temp, 80);
  197. }
  198. /**
  199. * @brief 从寄存器读取设置参数
  200. * @return 无
  201. */
  202. void PLSROptionLoad(void)
  203. {
  204. Options.SentPost = Register_L[0x1000];
  205. Options.DirPost = Register_L[0x1001];
  206. Options.EXT = Register_L[0x1002];
  207. Options.DirDelay = Register_L[0x1003]; //可能更大。
  208. Options.Dir = Register_L[0x1004];
  209. Options.AccMod = Register_L[0x1005];
  210. Options.RunMod = Register_L[0x1006];
  211. Options.AllPulse = Register_L[0x1007];
  212. Options.StartPulse = Register_L[0x1008];
  213. Options.InitSpeed = Register_L[0x1009]; //需要修改。
  214. Options.AccUpTime = Register_L[0x100B];
  215. Options.AddDownTime = Register_L[0x100C];
  216. }