timer.c 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. #include "timer.h"
  2. #include "gd32e230_timer.h"
  3. #include "adc.h"
  4. uint16_t voltage_s[200] = {0};
  5. uint16_t current_s[200] = {0};
  6. static void ConfigTimer14(unsigned short arr, unsigned short psc)
  7. {
  8. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  9. //使能RCU相关时钟
  10. rcu_periph_clock_enable(RCU_TIMER14); //使能TIMER14的时钟
  11. timer_deinit(TIMER14); //设置TIMER14参数恢复默认值
  12. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  13. //配置TIMER14
  14. timer_initpara.prescaler = psc; //设置预分频器值
  15. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  16. timer_initpara.period = arr; //设置自动重装载值
  17. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  18. timer_init(TIMER14, &timer_initpara); //根据参数初始化定时器
  19. timer_interrupt_enable(TIMER14, TIMER_INT_UP); //使能定时器的更新中断
  20. nvic_irq_enable(TIMER14_IRQn, 0); //配置NVIC设置优先级
  21. timer_disable(TIMER14); //使能定时器
  22. }
  23. static void ConfigTimer15(unsigned short arr, unsigned short psc)
  24. {
  25. timer_parameter_struct timer_initpara; //timer_initpara用于存放定时器的参数
  26. //使能RCU相关时钟
  27. rcu_periph_clock_enable(RCU_TIMER15); //使能TIMER15的时钟
  28. timer_deinit(TIMER15); //设置TIMER15参数恢复默认值
  29. timer_struct_para_init(&timer_initpara); //初始化timer_initpara
  30. //配置TIMER15
  31. timer_initpara.prescaler = psc; //设置预分频器值
  32. timer_initpara.counterdirection = TIMER_COUNTER_UP; //设置向上计数模式
  33. timer_initpara.period = arr; //设置自动重装载值
  34. timer_initpara.clockdivision = TIMER_CKDIV_DIV1; //设置时钟分割
  35. timer_init(TIMER15, &timer_initpara); //根据参数初始化定时器
  36. timer_interrupt_enable(TIMER15, TIMER_INT_UP); //使能定时器的更新中断
  37. nvic_irq_enable(TIMER15_IRQn, 3); //配置NVIC设置优先级
  38. timer_enable(TIMER15); //使能定时器
  39. }
  40. void InitTimer(void)
  41. {
  42. ConfigTimer14(99, 71); //100ns
  43. ConfigTimer15(9999, 7199); //1s
  44. }
  45. void ADC_TimerEnable(void)
  46. {
  47. timer_enable(TIMER14);
  48. }
  49. void ADC_TimerDisable(void)
  50. {
  51. timer_disable(TIMER14);
  52. }
  53. extern uint8_t flash_led;
  54. extern uint8_t read_flag;
  55. extern uint16_t adc_original_value[4];
  56. void TIMER14_IRQHandler(void)
  57. {
  58. static int index = 0;
  59. if(timer_interrupt_flag_get(TIMER14, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  60. {
  61. timer_interrupt_flag_clear(TIMER14, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  62. }
  63. if((adc_original_value[0] - adc_original_value[1]) >= 0x10)
  64. {
  65. voltage_s[index] = adc_original_value[0] - adc_original_value[1]-5;
  66. }else
  67. {
  68. voltage_s[index] = 0;
  69. }
  70. if((adc_original_value[2] - adc_original_value[3]) >= 0x4)
  71. {
  72. current_s[index] = adc_original_value[2] - adc_original_value[3]-3;
  73. }else
  74. {
  75. current_s[index] = 0;
  76. }
  77. // if(adc_original_value[0] > adc_original_value[1])
  78. // {
  79. // if(adc_original_value[0] - adc_original_value[1] >= 10)
  80. // voltage_s[index] = adc_original_value[0] - adc_original_value[1] - 5;
  81. // else
  82. // voltage_s[index] = 0;
  83. // //voltage_s[index] = voltage_s[index] > 20 ? voltage_s[index]- 5: 0;
  84. // }else
  85. // {
  86. // voltage_s[index] = 0;
  87. // }
  88. // if(adc_original_value[2] > adc_original_value[3])
  89. // {
  90. // if(adc_original_value[2] - adc_original_value[3] >= 4)
  91. // current_s[index] = adc_original_value[2] - adc_original_value[3] -4;
  92. // else
  93. // current_s[index] = 0;
  94. // //current_s[index] = current_s[index] > 10 ? current_s[index]- 4: 0;
  95. // }else
  96. // {
  97. // current_s[index] = 0;
  98. // }
  99. index++;
  100. // if(adc_original_value[0]>0x20 )
  101. // voltage_s[index] = adc_original_value[0] -5;
  102. // else
  103. // voltage_s[index] = 0;
  104. // if(adc_original_value[2] > 0x10 )
  105. // current_s[index++] = adc_original_value[2]-4;
  106. // else
  107. // current_s[index++] = 0;
  108. if(index == 200)
  109. {
  110. index = 0;
  111. ADC_TimerDisable(); //close timer and calculate
  112. read_flag = 1;
  113. }
  114. }
  115. void TIMER15_IRQHandler(void)
  116. {
  117. if(timer_interrupt_flag_get(TIMER15, TIMER_INT_FLAG_UP) == SET) //判断定时器更新中断是否发生
  118. {
  119. timer_interrupt_flag_clear(TIMER15, TIMER_INT_FLAG_UP); //清除定时器更新中断标志
  120. }
  121. flash_led = 1;
  122. }