新手入门
- 积分
- 16
- 金钱
- 16
- 注册时间
- 2019-6-5
- 在线时间
- 2 小时
|
用STM32的定时器TIM1产生四路两两互补的PWM波,用TIM2的中断来改变TIM1的输出波形的比较值,时序图如下,示波器的波形图为:用TIM1的CH1,CH2,CH1N,CH2N来产生A、B、C、D,,代码为
void TIM1_PWM_Init(u16 arr,u16 psc)
{
RCC->APB2ENR|=1<<11; //使能TIM1的时钟
// RCC->APB2ENR|=0<<1; //使能复用时钟
RCC->APB2ENR|=1<<2; //使能GPIOA的时钟CH1-PA9 CH2-PA10 CH1N-PB13 CH2N-PB14
RCC->APB2ENR|=1<<3; //使能GPIOB的时钟
GPIOA->CRH&=0XFFFFFF00; //PA9为复用推挽输出,最大速度50MHZ ,必须为复用推挽输出!!!
GPIOA->CRH|=0X000000BB;
GPIOB->CRH&=0XF00FFFFF; //PA9为复用推挽输出,最大速度50MHZ ,必须为复用推挽输出!!!
GPIOB->CRH|=0X0BB00000;
TIM1->CCR1=6199;
TIM1->CCR2=7199;
TIM1->ARR=arr; //设定计数器自动重装值
TIM1->PSC=psc; //预分频器不分频
// TIM1->BDTR|=0xCD; // 死区时间设定
TIM1->CCER|=1<<0;//TIM1CH1通道开关使能
TIM1->CCER|=1<<2;//TIM1CH1N 通道开关
TIM1->CCER|=1<<4;
TIM1->CCER|=1<<6;
TIM1->CCMR1|=7<<4; //CH1 PWM2模式
TIM1->CCMR1|=1<<3; //CH1预装载使能
TIM1->CCMR1|=7<<12; //CH2 PWM2模式
TIM1->CCMR1|=1<<11; //CH1预装载使能
TIM1->CR1|=0X80;// CR1 ARPE自动重装载预装载允许位使能
// TIM1->BDTR=0;
TIM1->BDTR=0x80;
TIM1->BDTR|=1<<15; //刹车使能位置1,开启所有输出通道
// TIM1->CR1|=0X01; //使能定时计数器1
}
void TIM2_Init(u16 arr,u16 psc )
{
RCC->APB1ENR|=1<<0; //使能TIM2的时钟
TIM2->CR1&=0XFFEE; //计数器向上计数
TIM2->CR1|=0X0001;
TIM2->ARR=arr;
TIM2->PSC=psc;
TIM2->DIER|=1<<0; //允许更新中断
MY_NVIC_Init(2,0,TIM2_IRQn,2); //抢占优先级2,子优先级2,组2
}
void TIM2_IRQHandler(void)
{
static u8 cnt=0;
if(TIM2->SR&0X0001) //产生溢出中断
{
if (cnt==0)
{
TIM2->ARR=7200; //定时器中断时间设置为100us
TIM2->PSC=0;
TIM1->CCR1|=1<<0;
TIM1->CCR1=6199; //6199
TIM1->CCR2=7199;
cnt=1;
}
if(cnt==1)
{
TIM2->ARR=7200; //定时器中断时间设置为800us
TIM2->PSC=7;
TIM1->ARR=7200; //定时器中断时间设置为800us
TIM1->PSC=7;
TIM1->CR1&=~(1<<0);
TIM1->CCR1=7199;
TIM1->CCR2=7199;
cnt=2;
LED1=!LED1;
}
if (cnt==2)
{
TIM2->ARR=7200; //定时器中断时间设置为100us
TIM2->PSC=0;
TIM1->ARR=7200; //定时器中断时间设置为100us
TIM1->PSC=0;
TIM1->CR1|=1<<0;
TIM1->CCR1=7199;
TIM1->CCR2=4500;
cnt=0;
}
}
TIM2->SR&=~(1<<0); //清楚中断标志位
}
感觉没有按照我的中断来输出波形,这是为什么呀,要实现我时序那样的波形应该写代码呀
|
-
-
|