
用timer1互补输出,能得到周期为50us的波形,没死区的话占空比为50%,要得到5us的死区时间 ,不应该TIM1->BDTR|=0x00CD吗,我用TIM1->BDTR|=0x002D;居然得到了5us的死区,前者反而得不到,难道TDTS有问题,不等于72MHZ?
void PWM_Init(u16 arr,u16 psc),
{
//此部分需手动修改IO口设置
RCC->APB2ENR|=1<<11; //TIM1时钟使能
RCC->APB2ENR|=1<<2; //GPIOA时钟使能
RCC->APB2ENR|=1<<3; //GPIOB时钟使能
GPIOA->CRH&=0XFFFFFF00; //PA8,PA9输出
GPIOA->CRH|=0X000000BB; //复用功能输出 推挽式
GPIOA->ODR|=3<<8; //PA8,PA9上拉
GPIOB->CRH&=0XF00FFFFF; //PB13,PB14输出
GPIOB->CRH|=0X0BB00000; //复用功能输出 推挽式
GPIOB->ODR|=3<<13; //PB13,PB14上拉
TIM1->ARR=arr;//设定计数器自动重装值
TIM1-> SC=psc;//预分频器分频
TIM1->CCMR1|=6<<4; //CH1 PWM1模式
TIM1->CCMR1|=1<<3; //CH1预装载使能
TIM1->BDTR|=0x002D; //72Mhz算,若BDTR低八位为2D,则死区时间=13.89nsXDTG,不等于5us啊 。
不应该是BDTR低八位为CD,然后死区时间=13.89nsX(32+DTG)X8=5us吗 ,就是这里没搞明白
TIM1->CCER|=1<<0; //OC1 输出使能
TIM1->CCER|=1<<2; //CH1互补输出使能
TIM1->CCER&=~(1<<1); //OC1高电平有效
TIM1->CCER&=~(1<<3); //OC1高电平有效
TIM1->CR1|=8<<4; ; //ARPE使能 ,左边沿对齐,向上计数
TIM1->EGR|=1<<0; //计数器清零
TIM1->BDTR|=1<<15; //主输出使能(MOE=1)
TIM1->CR1|=0x01; //使能定时器1
}
主函数:
int main(void)
{
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,9600); //串口初始化
LED_Init(); //初始化与LED连接的硬件接口
  WM_Init(399,8); //9分频,PWM频率为20KHZ
while(1)
{
TIM1->CCR1=200;
}
}
大神呢?求帮助!
|