我用的是MiniSTM32的开发板
问题:1.通过TIM1_BKIN(PB12脚)引脚输入高电平,但是MOE还是没反应,即不能刹车
2.不管怎么改变OIS1,OIS1N的值,用软件产生刹车后,OC1和OC1N一直输出低电平
主模块:
#include "sys.h"
#include "usart.h"
#include "sa.h"
int main(void)
{
Stm32_Clock_Init(9);
uart_init(72,9600);
TIM1_PWM_Sa_Init(0XFFFF,0,0XFF); //预分频9,PWM频率=72000000/9/400=20khz
while(1)
{
}
}
刹车函数:
#include "sa.h"
void TIM1_PWM_Sa_Init(u16 arr,u16 psc,u16 ccr1)
{
RCC->APB2ENR|=1<<11; //TIM1时钟使能
RCC->APB2ENR|=1<<2; //GPIOA时钟使能
RCC->APB2ENR|=1<<3; //GPIOB时钟使能
GPIOA->CRH&=0XFFFFFFF0; // 清除原来配置
GPIOA->CRH|=0X0000000B; //PA.8复用功能输出 推挽式
GPIOA->ODR|=1<<8; //PA.8上拉
GPIOB->CRH&=0XFFF0FFFF; // 清除原来配置
GPIOB->CRH|=8<<16; //PB.12配置为上拉/下拉输入模式
GPIOB->ODR&=~(1<<12); //PB.12下拉
GPIOB->CRH&=0XFF0FFFFF; //清除原来配置
GPIOB->CRH|=0X00B00000; //PB.13复用功能输出 推挽式
GPIOB->ODR|=1<<13; //PB.13上拉
TIM1->CCMR1|=7<<4; //CH1 PWM1模式
TIM1->CR1|=1<<5; //CMS[1:0]=01
TIM1->CCR1=ccr1;
TIM1->ARR=arr; //设定计数器自动重装值fPWM=fCK_CNT/(ARR[15:0]+1)
TIM1-> SC=psc; //预分频器设置 fCK_CNT=fck_PSC/(PSC[15:0]+1)
TIM1->BDTR|=0xCD; //72Mhz算,死区时间=13.89nsX(32+DTG)X8=5us
TIM1->BDTR|=1<<13; //BKR=1,即刹车输入有效电平为高电平
TIM1->BDTR|=1<<12; //BKE=1,即开启刹车输入
TIM1->BDTR|=1<<15; //MOE=1,主输出使能
TIM1->CR2&=~(1<<8); //OIS1=0
TIM1->CR2|=1<<9;//OIS1N=1
TIM1->CCER|=0x01; //CH1 OC1信号输出使能
TIM1->CCER|=1<<2; //CH1互补输出使能
TIM1->DIER|=1<<7; //BIE=1,即使能刹车中断
TIM1->CR1|=0x01; //使能定时器1
MY_NVIC_Init(2,0,TIM1_BRK_IRQChannel,2);
}
刹车中断:
void TIM1_BRK_IRQHandler(void)
{
printf("发生刹车\n");
TIM1->SR&=~(1<<7); //清除刹车中断标志
}
刹车.H文件
#ifndef __SA_H
#define __SA_H
#include "sys.h"
#include "usart.h"
void TIM1_PWM_Sa_Init(u16 arr,u16 psc,u16 ccr1);
#endif
|