当前位置:   article > 正文

stm32 检测相位差 并简单实现两个单片机的通信_输入捕获相位差

输入捕获相位差

红叶何时落水

校赛第二部分

详见

http://t.csdn.cn/50yJu

利用定时器的输入捕获模式来测量相位差

通过 (两路波形上升沿的时间差 / 波形周期)* 360°来实现相位差的测量

deg = (360 - (((TIM2CH1_CAPTURE_VAL3 * 360)  / (TIM2CH1_CAPTURE_VAL)) + chart)) % 180;

其中chart为线性补偿,可以通过按键改变其值,以此实现不同电路的测量

可以利用相位差来计算相应的频率与峰峰值

难点在于C语言中int 类型 (2 / 3)* 3 = 0;

解决,((2 * 10 / 3) * 3) / 10 = 1;尽量吧

  1. vpp = (((((deg * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ;
  2. tim4 = 1000000 / (35 * deg - 600);

再一个功能,第二个单片机需要实现扫描功能,而第三个需要检测它。

那么我们如何保证输出与检测同时进行呢?

方案一

难点,需要极快的手速,两个单片机的按键同时按下。

结局方案,多多练习手速

方案二

因为两个单片机只允许用一根线连接,所以我们只能用电压作为启动信号。

将第二个单片机的前五秒输出设置为3.3V输出,之后再扫描。

而第三个单片机再检测到小于3.3V的电压后,在进行数据的采集。

不足,由于启动信号为直流,所以在经过放大与衰减电路后会失真,导致启动信号失效。

解决,将启动信号改成峰峰值为3.3V的正弦波,后续电路检测峰峰值是否小于3.3V

主函数

  1. int main(void)
  2. {
  3. u16 adcx;
  4. int i = 0, t = 0;
  5. Init();
  6. while(1)
  7. {
  8. deg = (360 - (((TIM2CH1_CAPTURE_VAL3 * 360) / (TIM2CH1_CAPTURE_VAL)) + chart)) % 180;
  9. delay_ms(50);
  10. change();
  11. t=KEY_Scan(0); //µÃµ½¼üÖµ
  12. switch(t)
  13. {
  14. case KEY0_PRES:
  15. pint_deg = (pint_deg + 1) % 5;
  16. LCD_ShowxNum(120,50, pint_deg,3,16,0X80);
  17. break;
  18. case KEY1_PRES:
  19. deg2 = deg2 + 10;
  20. if(pint_deg == 3)
  21. {chart++;}
  22. break;
  23. case WKUP_PRES:
  24. deg2 = deg2 - 10;
  25. if(pint_deg == 3)
  26. {chart--;}
  27. break;
  28. default:
  29. delay_ms(10);
  30. }
  31. }
  32. }
  33. void Init(void) {
  34. uart_init(9600);
  35. delay_init();
  36. LCD_Init();
  37. KEY_Init();
  38. TIM5_Int_Init(0XFFFF,0);
  39. TIM3_Int_Init(0XFFFF,0);
  40. Dac3_Init();
  41. MYDMA1_Config( (u32) & (DAC->DHR12R1), (u32)SIN, 72);
  42. TIM2_Config(tim4, 1);
  43. POINT_COLOR=BLUE;
  44. LCD_ShowString(80,50,50,16,16,"deg");
  45. LCD_ShowString(80,70,50,16,16,"deg2");
  46. LCD_ShowxNum(120,50, pint_deg,3,16,0X80);
  47. }
  48. void change(void) {
  49. int n = 0;
  50. if(pint_deg == 0) {
  51. if(old_deg != deg) {
  52. old_deg = deg;
  53. vpp = (((((deg * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ;
  54. tim4 = 1000000 / (35 * deg - 600);
  55. LCD_ShowxNum(50,50, deg,3,16,0X80);
  56. for(i = 0; i < 72; i++) {
  57. SIN[i] = old_SIN[i] * vpp;
  58. }
  59. TIM2->ARR = tim4;
  60. delay_ms(500);
  61. }
  62. } else if(pint_deg == 1) {
  63. if(old_deg2 != deg2) {
  64. old_deg2 = deg2;
  65. vpp = (((((deg2 * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ;
  66. tim4 = 1000000 / (35 * deg2 - 600);
  67. LCD_ShowxNum(50,70, deg2,3,16,0X80);
  68. LCD_ShowString(80,100,200,16,16,"V = 1/28P - 4/7 ");
  69. LCD_ShowString(80,120,200,16,16,"F = 35P - 600");
  70. for(i = 0; i < 72; i++) {
  71. SIN[i] = old_SIN[i] * vpp;
  72. }
  73. TIM2->ARR = tim4;
  74. delay_ms(50);
  75. }
  76. } else if(pint_deg == 4) {
  77. for(i = 0; i < 72; i++) {
  78. SIN[i] = 4000;
  79. }
  80. delay_ms(10000);
  81. for(i = 0; i < 70; i++) {
  82. tim4 = 1000000 / (35 * (20 + 2 * i) - 600);
  83. vpp = ((((((20 + 2 * i) * 1000000)/56 - 285714) / 33) * 4096)/ 88) / 100000 ;
  84. LCD_ShowxNum(50,70, (20 + 2 * i),3,16,0X80);
  85. for(n = 0; n < 72; n++) {
  86. SIN[n] = old_SIN[n] * vpp;
  87. }
  88. TIM2->ARR = tim4;
  89. delay_ms(20);
  90. }
  91. pint_deg = 0;
  92. LCD_ShowxNum(120,50, pint_deg,3,16,0X80);
  93. } else if(pint_deg == 2) {
  94. if(old_deg2 != deg2) {
  95. old_deg2 = deg2;
  96. tim4 = 1000000 / (35 * deg2 - 600);
  97. vpp = ((((((35 * deg2 - 600) * 100000 / 2000)) / 33) * 4096)/ 88) / 10000 ;
  98. LCD_ShowString(80,100,200,16,16,"V = F / 2000 ");
  99. LCD_ShowString(80,120,200,16,16," ");
  100. LCD_ShowxNum(50,70, deg2,3,16,0X80);
  101. for(i = 0; i < 72; i++) {
  102. SIN[i] = old_SIN[i] * vpp;
  103. }
  104. TIM2->ARR = tim4;
  105. delay_ms(50);
  106. }
  107. }
  108. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/神奇cpp/article/detail/930548
推荐阅读
相关标签
  

闽ICP备14008679号