Advertisement
petrdynin

interrupt

Feb 16th, 2024
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.60 KB | None | 0 0
  1. /********************************** (C) COPYRIGHT *******************************
  2.  * File Name          : main.c
  3.  * Author             : WCH
  4.  * Version            : V1.0.0
  5.  * Date               : 2022/08/08
  6.  * Description        : Main program body.
  7.  *********************************************************************************
  8.  * Copyright (c) 2021 Nanjing Qinheng Microelectronics Co., Ltd.
  9.  * Attention: This software (modified or not) and binary are used for
  10.  * microcontroller manufactured by Nanjing Qinheng Microelectronics.
  11.  *******************************************************************************/
  12.  
  13. #include <ch32v00x.h>
  14. //#include "debug.h"
  15.  
  16.  
  17. /* Global define */
  18.  
  19.  
  20. /* Global Variable */
  21.  
  22. //Положение фаз в таблице синуса.
  23. uint8_t Fase1= 0;
  24. uint8_t Fase2= 20;
  25. uint8_t Fase3= 40;
  26. //Продолжительность аварийного торможения.
  27. uint16_t cycle_stop= 0;
  28. //Таблица ШИМ, минимальное значение 75 и максимальное не должно превышать 8000-75=7925,
  29. //в 75 это 1/24000000*75= 3 микросекунды находится: 1 микросекунда это Dead-time + 2 микросекунды
  30. //продолжительность HIN для IR2136( Data Sheet No. PD60166 revU, стр 5 под первой таблицей).*/
  31. uint16_t Sin_pwm_tab[60]={ 4000, 4410, 4816, 5213, 5596, 5963, 6307, 6626, 6917, 7175, 7399, 7586, 7733, 7839, 7903, 7925,
  32. 7903, 7839, 7733, 7586, 7399, 7175, 6917, 6626, 6307, 5963, 5596, 5213, 4816, 4410, 4000, 3590, 3184, 2787, 2404, 2037, 1693,
  33. 1374, 1083, 825, 601, 414, 267, 161, 97, 75, 97, 161, 267, 414, 601, 825, 1083, 1374, 1693, 2037, 2404, 2787, 3184, 3590};
  34.  
  35. uint8_t cnt = 0;
  36.  
  37. void TIM1_UP_IRQHandler(void) __attribute__((interrupt("WCH-Interrupt-fast")));
  38. void EXTI7_0_IRQHandler (void) __attribute__((interrupt()));
  39.  
  40.  
  41. void Gpio_Init(void)
  42. {
  43.  
  44.     RCC->APB2PCENR  |= RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD;
  45.  
  46.     // T1CH1 (PD2 GPIO_Mode_AF_OUT)
  47.     GPIOD->CFGLR  = (GPIOD->CFGLR & ~GPIO_CFGLR_CNF2) | GPIO_CFGLR_CNF2_1;
  48.     GPIOD->CFGLR |= GPIO_CFGLR_MODE2;
  49.  
  50.     // T1CH1N (PD0 GPIO_Mode_AF_OUT)
  51.     GPIOD->CFGLR  = (GPIOD->CFGLR & ~GPIO_CFGLR_CNF0) | GPIO_CFGLR_CNF0_1;
  52.     GPIOD->CFGLR |= GPIO_CFGLR_MODE0;
  53.  
  54.     // T1CH2 (PA1 GPIO_Mode_AF_OUT)
  55.     GPIOA->CFGLR  = (GPIOA->CFGLR & ~GPIO_CFGLR_CNF1) | GPIO_CFGLR_CNF1_1;
  56.     GPIOA->CFGLR |= GPIO_CFGLR_MODE1;
  57.  
  58.     // T1CH2N (PA2 GPIO_Mode_AF_OUT)
  59.     GPIOA->CFGLR  = (GPIOA->CFGLR & ~GPIO_CFGLR_CNF2) | GPIO_CFGLR_CNF2_1;
  60.     GPIOA->CFGLR |= GPIO_CFGLR_MODE2;
  61.  
  62.     // T1CH3 (PC3 GPIO_Mode_AF_OUT)
  63.     GPIOC->CFGLR  = (GPIOC->CFGLR & ~GPIO_CFGLR_CNF3) | GPIO_CFGLR_CNF3_1;
  64.     GPIOC->CFGLR |= GPIO_CFGLR_MODE3;
  65.  
  66.     // T1CH3N (PD1 GPIO_Mode_AF_OUT)
  67.     GPIOD->CFGLR  = (GPIOD->CFGLR & ~GPIO_CFGLR_CNF1) | GPIO_CFGLR_CNF1_1;
  68.     GPIOD->CFGLR |= GPIO_CFGLR_MODE1;
  69.  
  70.  
  71.     //PC1 (GPIO_Mode_OUT_PP)
  72.     GPIOC->CFGLR  = (GPIOC->CFGLR & ~(GPIO_CFGLR_CNF1_0 | GPIO_CFGLR_CNF1_1));
  73.     GPIOC->CFGLR |= GPIO_CFGLR_MODE1;
  74.     GPIOC->BSHR = GPIO_BSHR_BR1;
  75.  
  76. }
  77.  
  78.  
  79. void TIM1_Dead_Time_Init(u16 arr, u16 psc, u16 ccp)
  80. {
  81.     GPIO_InitTypeDef        GPIO_InitStructure = {0};
  82.     TIM_OCInitTypeDef       TIM_OCInitStructure = {0};
  83.     TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure = {0};
  84.     TIM_BDTRInitTypeDef     TIM_BDTRInitStructure = {0};
  85.  
  86.     RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD | RCC_APB2Periph_TIM1, ENABLE);
  87.  
  88.     /* TIM1_CH1 */
  89.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
  90.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  91.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  92.     GPIO_Init(GPIOD, &GPIO_InitStructure);
  93.  
  94.     /* TIM1_CH1N */
  95.     GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
  96.     GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  97.     GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  98.     GPIO_Init(GPIOD, &GPIO_InitStructure);
  99.  
  100.     TIM_TimeBaseInitStructure.TIM_Period = arr;
  101.     TIM_TimeBaseInitStructure.TIM_Prescaler = psc;
  102.     TIM_TimeBaseInitStructure.TIM_ClockDivision = TIM_CKD_DIV1;
  103.     TIM_TimeBaseInitStructure.TIM_CounterMode = TIM_CounterMode_Up;
  104.     TIM_TimeBaseInit(TIM1, &TIM_TimeBaseInitStructure);
  105.  
  106.     TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM2;
  107.     TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable;
  108.     TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Enable;
  109.     TIM_OCInitStructure.TIM_Pulse = ccp;
  110.     TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low;
  111.     TIM_OCInitStructure.TIM_OCNPolarity = TIM_OCNPolarity_Low;
  112.     TIM_OCInitStructure.TIM_OCIdleState = TIM_OCIdleState_Set;
  113.     TIM_OCInitStructure.TIM_OCNIdleState = TIM_OCNIdleState_Reset;
  114.     TIM_OC1Init(TIM1, &TIM_OCInitStructure);
  115.  
  116.     TIM_BDTRInitStructure.TIM_OSSIState = TIM_OSSIState_Disable;
  117.     TIM_BDTRInitStructure.TIM_OSSRState = TIM_OSSRState_Disable;
  118.     TIM_BDTRInitStructure.TIM_LOCKLevel = TIM_LOCKLevel_OFF;
  119.     TIM_BDTRInitStructure.TIM_DeadTime = 0xFF;
  120.     TIM_BDTRInitStructure.TIM_Break = TIM_Break_Disable;
  121.     TIM_BDTRInitStructure.TIM_BreakPolarity = TIM_BreakPolarity_High;
  122.     TIM_BDTRInitStructure.TIM_AutomaticOutput = TIM_AutomaticOutput_Enable;
  123.     TIM_BDTRConfig(TIM1, &TIM_BDTRInitStructure);
  124.  
  125.     TIM_CtrlPWMOutputs(TIM1, ENABLE);
  126.     TIM_OC1PreloadConfig(TIM1, TIM_OCPreload_Disable);
  127.     TIM_ARRPreloadConfig(TIM1, ENABLE);
  128.     TIM_Cmd(TIM1, ENABLE);
  129. }
  130.  
  131. void TIM1_Init(void){
  132.      RCC->APB2PCENR |= RCC_APB2Periph_TIM1;
  133.  
  134.      TIM1->PSC = 2-1;                     // 48000000/2 = 24MHz -> i.e 1 tick = 41,67 ns
  135.      TIM1->ATRLR = 8000-1;                // 48000000/(2*8000) = 3000 Гц
  136.      TIM1->RPTCR = 0;
  137.      TIM1->CTLR1 = TIM_ARPE;
  138.  
  139.      // конфигурация входов и режим работы PWM2
  140.      TIM1->CHCTLR1 = ((TIM1->CHCTLR1) & ~TIM_CC1S) | TIM_OC1M;
  141.      // определили активный уровень, включили выход
  142.      TIM1->CCER    = TIM_CC1P | TIM_CC1E | TIM_CC1NP | TIM_CC1NE;
  143.      // определили уровни в свободном состоянии
  144.      TIM1->CTLR2 = ((TIM1->CTLR2) & ~TIM_OIS1N) | TIM_OIS1;
  145.  
  146.      TIM1->CH1CVR = 4000;
  147.  
  148.      TIM1->BDTR |= TIM_MOE;
  149.  
  150.      TIM1->DMAINTENR |= TIM_UIE;
  151.      TIM1->CTLR1 |= TIM_CEN;
  152.  
  153.      NVIC_EnableIRQ(TIM1_UP_IRQn);
  154.      //SetVTFIRQ((u32)TIM1_UP_IRQHandler, TIM1_UP_IRQn,1,ENABLE);
  155. //////////////////////////////////////////////////////////////
  156.      /****** PWM out TIM2_CH3 (PC0) ********************/
  157.      //RCC->APB1PCENR |= RCC_APB2Periph_GPIOC;
  158.      //GPIOC->CFGLR |= GPIO_CFGLR_MODE0;
  159.      //GPIOC->CFGLR = (GPIOC->CFGLR & ~(GPIO_CFGLR_CNF0)) | GPIO_CFGLR_CNF0_1;
  160.      //TIM2->CH3CVR = 500;
  161.      //TIM2->CCER |= TIM_CC3E | TIM_CC3P;
  162.      //PWM mode 2, прямой ШИМ 3 канал
  163.      //TIM2->CHCTLR2 |= TIM_OC3M;
  164. /////////////////////////////////////////////////////////////
  165. }
  166.  
  167.  
  168.  
  169. void EXTI7_0_IRQHandler(void){
  170.  
  171.   EXTI->INTFR &= ~EXTI_INTF_INTF0;
  172.   cnt += 10;
  173.   //asm ("NOP");
  174.  
  175. }
  176.  
  177. void TIM1_UP_IRQHandler(){
  178.  
  179.     TIM1->INTFR &= ~TIM_UIF;
  180.     GPIOC->OUTDR ^= GPIO_OUTDR_ODR1;
  181.  
  182.     EXTI->SWIEVR |= EXTI_SWIEVR_SWIEVR0;
  183.     cnt++;
  184. }
  185.  
  186. void EXTI_init(){
  187.  
  188.   RCC->APB2PCENR |= RCC_APB2Periph_AFIO;
  189.   //AFIO->EXTICR |= AFIO_EXTICR1_EXTI0;
  190.   EXTI->EVENR |= EXTI_EVENR_MR0;
  191.   EXTI->INTENR |= EXTI_INTENR_MR0;
  192.   NVIC_EnableIRQ(EXTI7_0_IRQn);
  193.  
  194. }
  195.  
  196.  
  197. /*********************************************************************
  198.  * @fn      main
  199.  *
  200.  * @brief   Main program.
  201.  *
  202.  * @return  none
  203.  */
  204. int main(void)
  205. {
  206.  
  207.     Gpio_Init();
  208.  
  209.     //TIM1_Dead_Time_Init(100, 48 - 1, 50);
  210.  
  211.     TIM1_Init();
  212.     EXTI_init();
  213.  
  214.  
  215.     for(;;){
  216.  
  217.     }
  218.  
  219.  
  220. }
  221.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement