一、TIM1的相关作用
1.驱动波形生成
目前调试遇到的芯片有两种驱动逻辑:有效逻辑为(1)上高下低(2)上高下高(这里有效指输出高电压打开MOS)
用TIM1的通道1,2,3的OCx/OCxN来输入三相对应的驱动芯片引脚控制全桥的通断。将以通道1为例,介绍一下U相的的驱动配置。
首先明确的是,对应逆变全桥上,上下桥的波形一定是互补的,这是SVPWM算法决定的,因此针对不同驱动芯片的驱动逻辑需要采用不同的驱动配置。
(1)上高下低的驱动逻辑
根据驱动芯片的芯片上桥信号输入为高电平有效,下桥芯输入为低电平有效,我们期望的上下桥互补波形对应的芯片输入波形就如下:
这里解释一下为什么是0矢量的(000)放在波形中间,为的是兼容各种采样时方便三电阻方案选取采样点,放在PWM周期中间进行采样,此时下桥全开可以采出电流。
我们知道TIM1的OC1与OC1N输出的有效性是相反的,即OC1REF被置1(有效)时,OC1输出有效电平,OC1N输出无效电平,为了输出上图的同相波形,我们需要配置OC1与OC1N的有效波形的电平极性相反。
综上需求我们需要操作2个寄存器来实现。
1.TIM1_CCMR1
这里只需要看低字节,高字节配置的是OC2,而CCMR2对应的就是OC3与OC4的配置。
配置如下0110 1000 【0110 1000】,【】内的为通道1的配置,下面配置输出波形的极性。
OC1输出有效性如下:
2.TIM1_CCER
低字节的低四位为通道1 的配置
配置如下0001 1101 1101 【1101】,【】中的为通道1的配置。OC1的有效电平定义为高电平,OC1N的有效电平定义为低电平。结合上一寄存器的OC1输出电平有效性的图,可以发现输出波形与需要的波形一致。
通道2、3配置相同即可。
(2)上高下高的驱动逻辑
与上高下低的配置寄存器相同,只是将CCER的输出极性做了改变
CCER配置如下0001 0101 0101 【0101】。
2.TIM1-CH4触发采样
ST方案中通常使用TIM1的通道4作为TIM1的TRGO信号,再配置AD采样的触发条件为TIM1的TRGO信号,达到采样点灵活可变的需求,以应对单电阻采样的方案,而三电阻方案可固定在周期中点进行采样操作。
二、TIM2定时器捕获霍尔的应用
TIM2定时器作用于霍尔捕捉时的初始化及其注释,详细相关寄存器后续整理。
从手册中获得TIM2的运行框图如下:
TIM2的初始化方法如下:
void TIM2Init(void)
{
NVIC_InitTypeDef NVIC_InitHALLStructure;
RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM2,ENABLE);
TIM2->CR1=(2<<8)+(1<<7);
/*^
TIM2->CR1=(2<<8)--CKD(时钟分频因子为4分之一定时器时钟,用于输入捕获或对应数字滤波器的分配时基) 10:tDTS = 4 x tCK_INT
DTS是Discrimination Threshold of Sample(采样分辨阈值),因为它已经是最高采样频率(即最快采样速度),采样频率设置只能以它为基础进行分频。
TIM2->CR1=(1<<7)--TIMx_ARR寄存器缓冲器有效(预装载有效)
^*/
TIM2->CR2=(1<<7);
/*^
TIM2->CR2=(1<<7)-- TIMx_CH1,TIMx_CH2 ,TIMx_CH3异或后输入TI1
定时器三个输入脚CC1,CC2,CC3(对应三个霍尔)通过一个异或门连接到TI1输入通道 (见C51参考手册220页)
霍尔跳变异或值也会跳变:101 001 011 010 110 100
5 1 3 2 6 4
异或值: 0 1 0 1 0 1
^*/
TIM2->SMCR=(4<<4)+(4<<0);
/*^
TIM2->SMCR=(4<<4)--计数器触发选择为TI1的边沿检测器 TS[2:0]100的第三位,TI1边缘检测器对上下边缘都会进行检测,有边沿跳变TI1F_ED输出高产生TRC触发信号
TIM2->SMCR=(4<<0)--从模式选择:复位模式的触发输入 (TRGI) 的上升沿重新初始化计数器,并且产生一 个更新寄存器的信号
^*/
//滤波时间21us
TIM2->CCMR1=(15<<4)+(3<<0);
/*^
TIM2->CCMR1=(15<<4)--定义了 TI1 输入的采样频率及数字滤波器长度(N),1111:采样频率 fSAMPLING=fDTS/32,N=8
TIM2->CCMR1=(3<<0)--CC1通道配置为输入,IC1映射于TRC(这里TRC是作为IC1的输入,是TI1的边缘检测器产生的TRC内部直接映射到IC1的),此模式只工作在SMCR的TS位选中内部触发器时。
^*/
/*
注:CCER中CC1P与CC1NP共同控制IC1通道捕获输入信号(TI1产生的TRC)的有效沿,详见手册340页
这里默认为00,只捕获非反相的上升沿
*/
TIM2->CCER=(1<<0);
/*^
TIM2->CCER=(1<<0)--CC1通道输入捕获使能,开启捕捉
^*/
NVIC_InitHALLStructure.NVIC_IRQChannel = TIM2_IRQn;
NVIC_InitHALLStructure.NVIC_IRQChannelPriority = 0; //TIM2最高级中断,作为角度的捕获和读取
NVIC_InitHALLStructure.NVIC_IRQChannelCmd = ENABLE;
NVIC_Init(&NVIC_InitHALLStructure); //设置中断
TIM_ITConfig(TIM2, TIM_IT_CC1, ENABLE); //开启通道1的捕获中断
TIM2->ARR = 600000; //600MS的溢出时间
TIM2->PSC=47;//1us时基
TIM2->EGR|=(1<<0);//初始化计数器
TIM2->CR1|=(1<<0);//开始计数
}
u32 TIMEcnt ;
void TIM2_IRQHandler(void)
{
if(TIM2->SR&0x0040) //TIF触发中断标记
{
TIM2->SR &= 0xFFB1; //清中断标志
TIMEcnt = TIM2->CCR1; //捕捉计数
}
}