liubo
获得 1 次赞
帮助过1028人
用STM32的定时器TIM1产生四路两两互补的PWM波,用TIM2的中断来改变TIM1的输出波形的比较值,时序图如下,示波器的波形图为:用TIM1的CH1CH2CH1NCH2N来产生A、B、C、D代码为 void TIM1_PWM_Init(u16 arru16 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 arru16 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(20TIM2_IRQn2); //抢占优先级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); //清楚中断标志位 } 感觉没有按照我的中断来输出波形,这是为什么呀,要实现我时序那样的波形应该写代码呀
mt9v034的并行数据输出有10位,DOUT2~DOUT9输出8位的像素灰度值,那么DOUT0和DOUT1这另个引脚输出什么信息呢?在官方手册没找到。
通常辅助电源使用的都是反激电源,但是反激电源开关管电压应力明显高于输入电压。当电源输入电压比较高时辅助电源的开关管选择就比较困难了。有什么比较好的解决方案吗?