Чт апр 18, 2019 17:11:15
void GPIO_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO, ENABLE);
GPIO_InitTypeDef temp_GPIO_Init;
//PWM
temp_GPIO_Init.GPIO_Pin = PH1sig|PH2sig;
temp_GPIO_Init.GPIO_Speed = GPIO_Speed_10MHz;
temp_GPIO_Init.GPIO_Mode = GPIO_Mode_AF_PP;
GPIO_Init(GPIOA, &temp_GPIO_Init);
}
void PWM_init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE);
TIM1->CCMR1 = 0x0000;
TIM1->CR1 = 0x0000;
TIM1->CCER = 0x0000;
TIM1->DIER = 0x0000;
TIM1->BDTR = 0x0000;
TIM1->CCMR1 |= 0x6000; //PWM1 mode CH2
TIM1->CCMR2 |= 0x6000; //PWM1 mode CH4
TIM1->ARR = 20000;
TIM1->CCR2 = 1000;
TIM1->CCR4 = 1000;
//TIM1->PSC = 0x0009;
TIM1->CCMR1 |= 0x0800; //OC2 preload enable
TIM1->CCMR2 |= 0x0800; //OC4 preload enable
TIM1->CR1 |= 0x0080; //ARR preload enable
TIM1->CCER |= 0x0010; //CC2E = 1
TIM1->CCER |= 0x1000; //CC4E = 1
TIM1->BDTR |= 0x8000; //MOE = 1
TIM1->EGR |= 0x0001; //generate update event
TIM1->CR1 |= 0x0001; //counter enable
TIM1->DIER |= 0x0004; //compare CH2 interrupt enable
NVIC_EnableIRQ(TIM1_CC_IRQn);
__enable_irq(); //вроде не нужно, на всякий случай
}
#define PULSE_A 30
#define PULSE_B 70
#define PULSE_C 95
void TIM1_CC_IRQHandler(void)
{
TIM1->SR &= 0xFFE0; //5 flags reset
period = (float)TIM1->ARR;
switch(pulse)
{
case 1:
TIM1->CCR2 = (period/100)*PULSE_A;
TIM1->CCR4 = (period/100)*PULSE_C;
pulse += 1;
break;
case 2:
TIM1->CCR2 = (period/100)*PULSE_B;
TIM1->CCR4 = (period/100)*PULSE_B;
pulse += 1;
break;
case 3:
TIM1->CCR2 = (period/100)*PULSE_C;
TIM1->CCR4 = (period/100)*PULSE_A;
pulse += 1;
break;
case 4:
TIM1->CCR2 = (period/100)*PULSE_C;
pulse += 1;
break;
case 5:
TIM1->CCR2 = (period/100)*PULSE_B;
TIM1->CCR4 = (period/100)*PULSE_B;
pulse += 1;
break;
case 6:
TIM1->CCR2 = (period/100)*PULSE_A;
TIM1->CCR4 = (period/100)*PULSE_C;
pulse += 1;
break;
case 7:
TIM1->CCR2 = (period/100)*PULSE_A;
pulse += 1;
break;
case 8:
TIM1->CCR2 = (period/100)*PULSE_B;
TIM1->CCR4 = (period/100)*PULSE_B;
pulse += 1;
break;
case 9:
TIM1->CCR2 = (period/100)*PULSE_C;
TIM1->CCR4 = (period/100)*PULSE_A;
pulse += 1;
break;
case 10:
TIM1->CCR2 = (period/100)*PULSE_C;
pulse += 1;
break;
case 11:
TIM1->CCR2 = (period/100)*PULSE_B;
TIM1->CCR4 = (period/100)*PULSE_B;
pulse += 1;
break;
case 12:
TIM1->CCR2 = (period/100)*PULSE_A;
TIM1->CCR4 = (period/100)*PULSE_C;
pulse = 1;
break;
default:
break;
}
}
Чт апр 18, 2019 20:16:16
Чт апр 18, 2019 20:56:59