- 打卡等级:偶尔看看I
- 打卡总天数:12
- 最近打卡:2024-10-08 15:50:35
注册会员
- 积分
- 138
|
请教各位:
PWMA作为输出,并触发ADC;PWMB作为输入,对霍尔信号计数;
如果启用了PWMA触发ADC,则PWMB中断将不会被触发;
如果不使用PWMA触发ADC,则PWMB中断可以正常触发;
请教,我是哪里弄错了吗?
代码如下:
void PWM_Init()
{
//*** 设置前禁止PWMA/B所有输出 ***
//=== PWMA ===
PWMA_CCER1 = 0x00; //捕获/比较使能寄存器1,,,CC2/CC1,写CCMRx前必须先清零CCERx关闭通道
PWMA_CCER2 = 0x00; //捕获/比较使能寄存器1,,,CC4/CC3,写CCMRx前必须先清零CCERx关闭通道
PWMA_SR1 = 0x00; //状态寄存器1,,,清除事件CC4/3/2/1
PWMA_SR2 = 0x00; //状态寄存器2,,,重复捕获标记CC4/3/2/1
PWMA_ENO = 0x00; //IO禁止输出PWM
PWMA_IER = 0x00; //中断使能寄存器
//=== PWMB ===
PWMB_CCER1 = 0x00; //捕获/比较使能寄存器1,,,CC6/CC5
PWMB_CCER2 = 0x00; //捕获/比较使能寄存器1,,,CC8/CC7
PWMB_SR1 = 0x00; //状态寄存器1,,,清除事件CC8/7/6/5
PWMB_SR2 = 0x00; //状态寄存器2,,,重复捕获标记CC8/7/6/5
PWMB_ENO = 0x00; //IO禁止输出PWM,B6:ENO8P, B4:ENO7P, B2:ENO6P, B0:ENO5P
PWMB_IER = 0x00; //中断使能寄存器
//=====================================================
//*** PWMA ***
PWMA_CCR1 = 300; //捕获/比较寄存器: 设置占空比时间
PWMA_PSCRH = 0x00; //PWMA主频预分频H
PWMA_PSCRL = 0x00; //PWMA主频预分频L
PWMA_ARR = 1999; //自动重装载寄存器:= 45MHz / ((0+1)x(1999+1)) = 22.5kHz
PWMA_CCMR1 = 0x68; //捕获/比较模式寄存器:设置CC1为PWM模式1,,,0x60=禁止CCR1预装载(可随时更改CCR1)
PWMA_CCER1 = 0x0F; //捕获/比较使能寄存器:使能CC1通道
// //使用PWM触发ADC采样
// PWMA_IER = 0x01; //允许更新中断
// PWMA_CR2 = 0x20; // 更新事件为TRG0, 用于触发ADC
PWMA_ENO = 0x00; //初始化时禁止所有输出,,,此处不使用,由Motor控制
PWMA_BKR = 0x80; //刹车寄存器: 主输出使能 相当于总开关
PWMA_CR1 = 0x00; //计数器开始计数 ,,,此处关闭,由Motor控制
///////////////////////////////////////////////////
//*** PWMB ***
PWMB_CCMR1 = 0x31; //设置PWM5为输入,8个时钟滤波,无预分频器,映射到TI5FP5上
PWMB_CCMR2 = 0x31; //设置PWM6为输入,8个时钟滤波,无预分频器,映射到TI6FP6上
PWMB_CCMR3 = 0x31; //设置PWM7为输入,8个时钟滤波,无预分频器,映射到TI7FP7上
PWMB_CCMR4 = 0x31; //设置PWM8为输入,8个时钟滤波,无预分频器,映射到TI8FP8上
PWMB_CCER1 = 0x31; //设置PWM5捕获上升沿,PWM6捕获下降沿
PWMB_CCER2 = 0x31; //设置PWM7捕获上升沿,PWM7捕获下降沿
PWMB_CCMR1 |= 0x31; //更新为1个事件触发一次捕获
PWMB_CCMR2 |= 0x31; //更新为1个事件触发一次捕获
PWMB_CCMR3 |= 0x31; //更新为1个事件触发一次捕获
PWMB_CCMR4 |= 0x31; //更新为1个事件触发一次捕获
PWMB_IER = 0x1E; //B0001 1110,,,使能CCIE5/6/7/8中断
PWMB_EGR = 0x01; //手工产生一次更新事件, 清除计数器和预分频计数器, 装载预分频寄存器的值
PWMB_CR1 |= 0x01; //使能PWMB计数器, 允许自动重装载寄存器缓冲, 边沿对齐模式, 向上计数, bit7=1:写自动重装载寄存器缓冲(本周期不会被打扰), =0:直接写自动重装载寄存器本(周期可能会乱掉)
PWMB_ISR_En = PWMB_IER; //设置标志允许通道5~8中断处理
}
void PWMA_ISR(void) interrupt 26 //PWMA_VECTOR
{
}
void PWMB_ISR(void) interrupt 27 //PWMB_VECTOR
{
// u16 j;
u8 sr1, sr2;
//将SR1和SR2转入变量后,SR1和SR2可立即清零,避免后续处理影响下次高速中断
sr1 = PWMB_SR1; //为了快速, 中断标志用一个局部变量处理
PWMB_SR1 = 0; //清除中断标志
sr2 = PWMB_SR2; //为了快速, 中断标志用一个局部变量处理
PWMB_SR2 = 0; //清除中断标志
sr1 &= PWMB_ISR_En; //每个通道可以单独允许中断处理
MT.CurrHCnt++; //无论正反转,均累加,用于测速
// if(sr1 & 0x02){ //B0000 0010 通道5,H1A上升沿
// }
// if(sr1 & 0x04){ //B0000 0100 通道6,H1A下降沿
// }
// if(sr1 & 0x08){ //B0000 1000 通道7,H1B上升沿
// }
// if(sr1 & 0x10){ //B0001 0000 通道8,H1B下降沿
// }
}
|
|