萝丽高压有刷PN双向电调 -- 源码.c 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284
  1. #include<reg51.h>
  2. #include<intrins.h>
  3. #define u8 unsigned char
  4. #define u16 unsigned int
  5. //----------------------------------------------------------
  6. //STC15寄存器声明
  7. sfr P3M1=0xb1;
  8. sfr P3M0=0xb2;
  9. sfr AUXR=0x8e;
  10. sfr T2H=0xd6;
  11. sfr T2L=0xd7;
  12. sfr IE2=0xaf;
  13. //----------------------------------------------------------
  14. //引脚定义
  15. sbit AL=P3^0;
  16. sbit BL=P3^1;
  17. sbit AH=P3^2;
  18. sbit BH=P3^3;
  19. sbit IN=P3^4;
  20. //----------------------------------------------------------
  21. //MOS开关宏定义
  22. #define AH_ON AH=1
  23. #define AH_OFF AH=0
  24. #define BH_ON BH=1
  25. #define BH_OFF BH=0
  26. #define AL_ON AL=1
  27. #define AL_OFF AL=0
  28. #define BL_ON BL=1
  29. #define BL_OFF BL=0
  30. //----------------------------------------------------------
  31. //软件PWM
  32. u8 PWM_count;
  33. u8 PWM_duty_A;
  34. u8 PWM_duty_B;
  35. u8 PWM_value;
  36. //----------------------------------------------------------
  37. //控制
  38. bit lose;
  39. bit updata;
  40. bit Direction;
  41. bit Direction_last;
  42. u16 time;
  43. u16 timer2;
  44. void delay_us(u8 us) //@12.000MHz
  45. {
  46. while(--us)
  47. _nop_(),_nop_();
  48. }
  49. void delay_ms(u16 ms) //@12.000MHz
  50. {
  51. u16 i;
  52. do{
  53. i = 12000000 / 13022;
  54. _nop_(),_nop_(),_nop_();
  55. while(--i) ;
  56. }while(--ms);
  57. }
  58. void measure() //阻塞式脉宽测量
  59. {
  60. time=0;
  61. TL0=0,TH0=0;
  62. while(!IN);
  63. TR0=1;
  64. while(IN);
  65. TR0=0;
  66. time=TH0;
  67. time<<=8;
  68. time+=TL0;
  69. }
  70. void shock( u8 n) //震动发声
  71. {
  72. u8 i;
  73. u8 t=n/5;
  74. for(i=0;i<t;i++)
  75. {
  76. AH_OFF,BL_OFF;
  77. delay_ms(2);
  78. BH_ON;
  79. AL_ON; delay_us(50);
  80. AL_OFF;delay_us(n);
  81. AL_ON; delay_us(50);
  82. AL_OFF;delay_us(n);
  83. AL_ON; delay_us(50);
  84. AL_OFF;delay_us(n);
  85. AL_ON; delay_us(50);
  86. BH_OFF,AL_OFF;
  87. delay_ms(2);
  88. AH_ON;
  89. BL_ON; delay_us(50);
  90. BL_OFF;delay_us(n);
  91. BL_ON; delay_us(50);
  92. BL_OFF;delay_us(n);
  93. BL_ON; delay_us(50);
  94. BL_OFF;delay_us(n);
  95. BL_ON; delay_us(50);
  96. }
  97. AH_OFF,BL_OFF;
  98. BH_OFF,AL_OFF;
  99. delay_ms(5);
  100. }
  101. main()
  102. {
  103. AL_OFF;BL_OFF; //上电关闭输出
  104. AH_OFF;BH_OFF;
  105. P3M0=0x0f; //IO推挽输出
  106. delay_ms(400);
  107. shock( 200 ); //上电音乐,表明正常工作
  108. shock( 150 );
  109. shock( 100 );
  110. delay_ms(600);
  111. TMOD=0x01; //启动定时器测量
  112. measure();
  113. measure();
  114. measure();
  115. measure();
  116. measure();
  117. while(1)
  118. {
  119. measure();
  120. if(time>=1470 && time<=1530)//等待油门中位点
  121. {
  122. break;
  123. }
  124. }
  125. shock( 100 ); //就绪音乐,表明已检测到中位
  126. shock( 150 );
  127. shock( 200 );
  128. IE=0x80;
  129. IE2=0x04;
  130. T2L=0xF6;T2H=0xFF; //开启软件PWM
  131. AUXR=0x10;
  132. measure();
  133. measure();
  134. while(1)
  135. {
  136. measure();
  137. measure();
  138. if(lose)
  139. {
  140. delay_ms(50);
  141. measure();
  142. measure();
  143. measure();
  144. }
  145. if(time>500&&time<2500) //只受理合理舵量范围
  146. {
  147. timer2=0; lose=0;
  148. if(time>=1530 ) //正转
  149. {
  150. PWM_value= (time-1520)/4; //补偿摩擦力
  151. Direction=0;
  152. updata=1;
  153. }
  154. else if(time<=1470 ) //反转
  155. {
  156. PWM_value= (1480-time)/4;
  157. Direction=1;
  158. updata=1;
  159. }
  160. else //停止
  161. {
  162. PWM_duty_A=0;
  163. PWM_duty_B=0;
  164. AH_OFF;
  165. BH_OFF;
  166. }
  167. if(updata)
  168. {
  169. updata=0;
  170. if(Direction != Direction_last) //运行方向改变
  171. {
  172. PWM_duty_A=0;
  173. PWM_duty_B=0;
  174. AH_OFF;
  175. BH_OFF;
  176. delay_ms(3); //延时以保证上臂关闭
  177. }
  178. Direction_last=Direction;
  179. if(Direction) //AH -> BL
  180. {
  181. AH_ON;BH_OFF;
  182. PWM_duty_A=0;
  183. PWM_duty_B=PWM_value;
  184. }
  185. else //BH -> AL
  186. {
  187. BH_ON;AH_OFF;
  188. PWM_duty_B=0;
  189. PWM_duty_A=PWM_value;
  190. }
  191. }
  192. }
  193. }
  194. }
  195. void ET2_isr()interrupt 12//软件PWM 1Khz
  196. {
  197. PWM_count++;
  198. if(PWM_count==100) //100级分辨率
  199. {
  200. PWM_count=0;
  201. timer2++;
  202. if(timer2>500)//0.5S无信号保护
  203. {
  204. timer2=0; lose=1;
  205. PWM_duty_A=0;
  206. PWM_duty_B=0;
  207. AH_OFF;
  208. BH_OFF;
  209. }
  210. }
  211. if(PWM_duty_A > PWM_count)AL_ON;
  212. else AL_OFF;
  213. if(PWM_duty_B > PWM_count)BL_ON;
  214. else BL_OFF;
  215. }