论坛元老
 
- 积分
- 3347
- 金钱
- 3347
- 注册时间
- 2013-4-10
- 在线时间
- 333 小时
|
发表于 2016-3-27 23:14:08
|
显示全部楼层
本帖最后由 likunxue 于 2016-3-28 02:23 编辑
可以的, 我在步进电机驱动闭环处理时,有一个电流采样时间的问题就是这样处理的,
我的 PWM是用定时器1产生的, 不过你用哪个产生都一样
/********************************************************************************************
函数名: 设置TIM4初始化函数
调 用: TIM4_int();
参 数: 无
说 明: 将定时器设置为单脉冲从模式,由定时器1每次更新起动,中断中完成触发ADC1的任务
********************************************************************************************/
void TIM4_Init(void)
{
RCC->APB1ENR |= 1<<2; //TIM4时钟使能
TIM4->ARR = 65535; //设定计数器自动重装值
TIM4->PSC = 0; //预分频器0,计数时钟36MHZ
BIT_ADM(TIM4->CR1,4) = 0; //向上计数模式
BIT_ADM(TIM4->EGR,0) = 1; //产生更新事件更新定时器2
BIT_ADM(TIM4->CR1,7) = 0; //禁止ARR预装载缓冲器
BIT_ADM(TIM4->SR, 0) = 0; //清除中断标志
//外部触发选择 TS = 0; 选择定时器1更新中断触发起动定时器4
BIT_ADM(TIM4->SMCR,4) = 0;
BIT_ADM(TIM4->SMCR,5) = 0;
BIT_ADM(TIM4->SMCR,5) = 0;
//SMS 从模式设置, 触发方式,计数器在TRGI的上升沿启动,但不复位
//只有计数器的起动中控制的
BIT_ADM(TIM4->SMCR,0) = 0;
BIT_ADM(TIM4->SMCR,1) = 1;
BIT_ADM(TIM4->SMCR,2) = 1;
//MMS[1:0]主模式选择,
BIT_ADM(TIM4->CR2,4) = 0; //010 选择定时器更新事件触发输出 TRGO信号
BIT_ADM(TIM4->CR2,5) = 1;
BIT_ADM(TIM4->CR2,6) = 0;
BIT_ADM(TIM4->CR1,3) = 1; //OPM 置定时器为单脉冲模式
BIT_ADM(TIM4->DIER,0) = 1; //开定时器4中断
SVP.ADC1_CNT = 65536-SVP.PWMPRD/2; //ADC1下次采样时刻(初始化设置为PWM波的中点
TIM4->CNT = SVP.ADC1_CNT;
MY_NVIC_Init(0,0,TIM4_IRQn,4); //抢占0,子优先级0,组4
}
/********************************************************************************************
函数名: 空间失量调制SVPWM定时器1初始化函数
调 用: SVPWM_TIM1_int(void)
参 数: 无
********************************************************************************************/
void SVPWM_TIM1_int(void)
{
RCC->APB2ENR |= 1<<11; //TIM1时钟使能
RCC->APB2ENR |= 1<<2; //使能PORTA时钟
GPIOA->CRH &= 0xFFFF0000;
GPIOA->CRH |= 0x0000BBBB; //PA8,PA9,PA10,PA11 复用功能
BIT_ADM(GPIOA->ODR, 8) = 1;
BIT_ADM(GPIOA->ODR, 9) = 1;
BIT_ADM(GPIOA->ODR,10) = 1;
BIT_ADM(GPIOA->ODR,11) = 1;
//通道1的输出配置
BIT_ADM(TIM1->CCMR1,3) = 1; //CH1预装载使能
BIT_ADM(TIM1->CCMR1,4) = 0; //CH1_PWM1模式
BIT_ADM(TIM1->CCMR1,5) = 1;
BIT_ADM(TIM1->CCMR1,6) = 1;
BIT_ADM(TIM1->CCER,0) = 1; //CH1输出使能(PA8)
BIT_ADM(TIM1->CCER,1) = 0; //主输出极性CC1P (0高电平有效,1低电平有效)
//通道2的输出配置
BIT_ADM(TIM1->CCMR1,11) = 1; //CH2预装载使能
BIT_ADM(TIM1->CCMR1,12) = 0; //CH2_PWM1模式
BIT_ADM(TIM1->CCMR1,13) = 1;
BIT_ADM(TIM1->CCMR1,14) = 1;
BIT_ADM(TIM1->CCER,4) = 1; //CH2输出使能(PA9)
BIT_ADM(TIM1->CCER,5) = 0; //主输出极性CC2P (0高电平有效,1低电平有效)
//通道3的输出配置
BIT_ADM(TIM1->CCMR2,3) = 1; //CH3预装载使能
BIT_ADM(TIM1->CCMR2,4) = 0; //CH3_PWM1模式
BIT_ADM(TIM1->CCMR2,5) = 1;
BIT_ADM(TIM1->CCMR2,6) = 1;
BIT_ADM(TIM1->CCER,8) = 1; //CH3输出使能(PA10)
BIT_ADM(TIM1->CCER,9) = 0; //主输出极性CC3P (0高电平有效,1低电平有效)
//通道4的输出配置
BIT_ADM(TIM1->CCMR2,11) = 1; //CH4预装载使能
BIT_ADM(TIM1->CCMR2,12) = 0; //CH4_PWM1模式
BIT_ADM(TIM1->CCMR2,13) = 1;
BIT_ADM(TIM1->CCMR2,14) = 1;
BIT_ADM(TIM1->CCER,12) = 1; //CH4输出使能(PA11)
BIT_ADM(TIM1->CCER,13) = 0; //主输出极性CC4P (0高电平有效,1低电平有效)
//比较寄存器初始化
TIM1->CCR1 = 0; //初始化比较寄存器全部为0初始输出低电平
TIM1->CCR2 = 0;
TIM1->CCR3 = 0;
TIM1->CCR4 = 0;
//定时器1初始化其它功能设置
TIM1->ARR = SVP.PWMPRD; //设定计数器自动重装值PWM的周期
TIM1->PSC = 0 ; //预分频器0
BIT_ADM(TIM1->CR1,7) = 1; //定时器ARPE充许
BIT_ADM(TIM1->CR1,5) = 0; ///边沿对齐模式
BIT_ADM(TIM1->CR1,6) = 0;
//BIT_ADM(TIM1->CR1,4) = 1; //向下计数
//设置MMS[2:0] 主模式选择,定时器的更新中断起动从定时器
BIT_ADM(TIM1->CR2,4) = 0;
BIT_ADM(TIM1->CR2,5) = 1;
BIT_ADM(TIM1->CR2,6) = 0;
BIT_ADM(TIM1->DIER,0) = 1; //开定时器1中断
BIT_ADM(TIM1->BDTR,15)= 1; //MOE位,主输出使能,只有该位是1全部 PWM才用有输出
BIT_ADM(TIM1->SR,0) = 0; //清除中断标志
MY_NVIC_Init(0,0,TIM1_UP_IRQn,4); //抢占1,子优先级0,组4
BIT_ADM(TIM1->EGR,0) = 1; //UG位,产生更新事件,软件置1,硬件自动清零
TIM4_Init(); //初始化定时器4
BIT_ADM(TIM1->CR1,0) = 0; //初始化关闭定时器没有PWM输出
}
这样,定时器1每次中断都会触发定时器4 一次, 由定时器4的中断更新触发 ADC自动完成转换! 这种方法,是可行的 只需要在定时器1的中断函数里更新 定时器4的计数器的值,就可以自由更改ADC的采样时间, 不用这种方法, 基本无法实现在PWM波的任意时刻采样电流值
/*******************************************************************************************
函 数 名: 定时器4中断函数
调 用: 无
参 数: 无
反 回 值: 无 (更新ADC2的注入组采样时间)
********************************************************************************************/
void TIM4_IRQHandler(void)
{
if(BIT_ADM(TIM4->SR,0) ==1)
{
BIT_ADM(TIM4->SR,0)= 0; //清除中断标志
TIM4->CNT = SVP.ADC2_CNT; //重装下次采样时时
}
}
|
|