代码如下,通道一设置成输入捕获,在没有信号输入的情况下会不断的进入中断,而且硬件仿真的结果,4个通道的终端标志都置位了。是在是调地头大了,求指点
//霍尔传感器接口配置
//霍尔传感器接在TIM3的CH1,2,3上
//硬件接口为PA6,7
B0
void TIM3_Hall_Init(void)
{
RCC->APB1ENR|=1<<1;//TIM3时钟开启
RCC->APB2ENR|=1<<3;//PB口时钟开启
RCC->APB2ENR|=1<<2;//PA口时钟开启
GPIOA->CRL&=0xF00FFFFF; //PA6,7
GPIOA->CRL|=0x08800000; //上拉/下拉输入模式
GPIOA->ODR|=0XC0; //上拉
GPIOB->CRL&=0XFFFFFFF0;//PB0
GPIOB->CRL|=0X00000008;//上拉、下拉模式
GPIOB->ODR|=0X1;//上拉
TIM3->
SC=72-1;
TIM3->ARR=65535;//获得一个最大的计数周期,时间长于霍尔传感器上两次变化的时间间隔
TIM3->CR1&=~(1<<4);//计数器向上计数
TIM3->CR1&=~(3<<8);//不分频
TIM3->CR2|=1<<7;//TIMx_CH1,CH2,CH3引脚经异或后连到TI1输入
TIM3->SMCR|=4<<4;//触发选择:TI1的边沿检测器(TI1F_ED)
TIM3->SMCR|=4<<0;//复位模式 – 选中的触发输入(TRGI)的上升沿重新初始化计数器,并且产生一个更新寄存器的信号。
TIM3->SMCR|=1<<7;//触发输入(TRGI)上的事件被延迟了
TIM3->CR2|=5<<4;//OC2REF信号被用于作为触发输出(TRGO)
//通道1测量电机速度
TIM3->CCER|=3<<0;//捕获使能,捕获发生在IC1的下降沿;当用作外部触发器时,IC1反相
TIM3->CCMR1|=3<<0;//C1通道被配置为输入,IC1映射在TRC上???
TIM3->CCMR1&=~(3<<2);//捕获输入口上检测到的每一个边沿都触发一次捕获
TIM3->CCMR1|=10<<4;//输入捕获1滤波器设置
//通道2触发换相事件
TIM3->CCMR1|=7<<12;//通道2设置成PWM2模式
TIM3->CCER|=1<<4;//开启- OC2信号输出到对应的输出引脚
TIM3->CCER&=~(1<<5);//高电平有效
TIM3->CCR2=1023;
// TIM3->DIER|=1<<6;//使能触发中断
TIM3->DIER|=1<<1;//允许捕获比较1中断
// TIM3->DIER|=1<<0;//允许更新中断
TIM3->CR1|=1<<0;//使能计数器
MY_NVIC_Init(1,3,TIM3_IRQChannel,2);//
TIM3->SR=0;
}
//TIM3的中断服务函数
void TIM3_IRQHandler(void)
{
static u16 Speed=0; //暂存速度测量值
if(TIM3->SR&(1<<1)) //产生比较/捕获事件1中断计数器溢出
{
printf("ok");
TIM3->SR&=~(1<<1);//清比较/捕获事件1中断标志
Speed=TIM3->CCR1;//读出捕获值,计算速度值
TIM1->CCR1+=pid_set(Speed); //针对PID输出对电机速度进行调节
TIM1->CCR2+=pid_set(Speed);
TIM1->CCR3+=pid_set(Speed);
}
}
---------------------------------
然后你就可以在中断里加入闭环调速
一周热门 更多>