各位老大们,本人现急需要实现,双ADC同步规则模式与注入同步模式作用,搞了好几天,都没有搞明白,希望能得到高人指导
/********************************************************************************************
函 数 名: ADC1,ADC2,初始化同步规则转换,采集A相电流与B相电流值
调 用: ADC_Motor_Init(void)
参 数: 无
返 回 值: 无
说 明: ADC1 模拟输入通道0, ADC2 模拟输入通道1由定时器CCIF4触发 设为同步注入模式(PA0, PA1)
ADC1 模拟输入通道10,ADC2 模拟输入通道11 由软件触发转换,设为同步规则转(PC0,PC1)********************************************************************************************/
void ADC_Motor_Init(void)
{
RCC->APB2ENR |= 0x00000610; //PCLK2/6 = 12MHZ(ADC转换器的时钟)
RCC->APB2ENR |= 1<<2; //使能PORTA口时钟
GPIOA->CRL &= 0XFFFFFF00; //PA0,PA1 anolog输入
RCC->APB2ENR |= 1<<4; //使能PORTC口时钟
GPIOC->CRL &= 0XFFFFFF00; //PC0,PC1 anolog输入
RCC->APB2ENR |= 1<<9; //ADC1时钟使能
RCC->APB2ENR |= 1<<10; //ADC2时钟使能
RCC->APB2RSTR |= 1<<9; //ADC1复位
RCC->APB2RSTR &= ~(1<<9); //ADC1复位结束
RCC->APB2RSTR |= 1<<10; //ADC2复位
RCC->APB2RSTR &= ~(1<<10); //ADC2复位结束
//ADC1寄存器的配置方法
ADC1->CR1 &= 0XF0FFFF; //工作模式清零
ADC1->CR1 |= 1<<16; //同步规则模式+注入同步模式
ADC1->CR1 |= 1<<7; //JEOCIE 产生注入通道转换结束中断
ADC1->CR1 &= ~(7<<17); //EXTSEL清零
ADC1->CR2 |=7<<17; //EXTSEL[2:0]选择启动规则通道组转换的外部事件
ADC1->CR2 |= 1<<15; //JEXTTRIG 注入通道外部触发转换模式使能 TIM1->CCIE4
ADC1->CR2 &= ~(3<<12);
ADC1->CR2 |= 1<<12; //设置EXTSEL[2:0]定时器1的CC4事件触发
ADC1->CR2 |= 1<< 8; //规则通道的数据使用DMA,传输
ADC1->SMPR2 &= ~(3<<0); //ADC1清零1通道的采样时间
ADC1->SMPR2 |= 1<<0; //ADC1通道1的采样时间设为7.5个周期
ADC1->SMPR1 &= ~(3<<0); //ADC1清零10通道的采样时间
ADC1->SMPR1 |= 1<<0; //ADC1通道10的采样时间设为7.5个周期
ADC1->SQR1 = 0x00000000; //规则序列寄存器只转换1个
ADC1->SQR2 = 0x00000000;
ADC1->SQR3 = 0x0000000A; //ADC1的通道10(PC0)
ADC1->JSQR = 0x00000000; //ADC1注入通道只转换一个,为通道0(PA0)
BIT_ADM(ADC1->CR2, 0) = 1; //使能ADC1
BIT_ADM(ADC1->CR2, 3) = 1; //使能ADC1复位校准
while(ADC1->CR2&1<<3); //等待复位校准结束
BIT_ADM(ADC1->CR2, 2) = 1; //开启AD校准,该位由软件设置以开始校准,
while(ADC1->CR2&1<<2); //等待校准结束
//ADC2寄存器配置的方法
ADC2->CR2 &= ~(3<<17);
ADC2->CR2 |= 7<<17; //EXTSEL[2:0]选择启动规则通道组转换的外部事件
ADC2->CR2 |= 1<<15; //JEXTTRIG 注入通道外部触发转换模式
ADC2->CR2 &= ~(3<<12); //JXETSEL[2:0]选择启动注入通道组转换的外部事件(清零)
ADC2->CR2 |= 7<<12; //为仿止意外触发,ADC2设为软件模式,由ADC1触发转换(注入)
ADC2->CR2 |= 1<< 8; //使用DMA,直接数据仿问模式
ADC2->SMPR1 &= ~(3<<3); //清零ADC2通道11的采样时间
ADC2->SMPR1 |= 1<<3; //ADC2通道11的采样时间设为7.5个周期
ADC2->SMPR2 &= ~(3<<3); //清零ADC2通道2的采样时间
ADC2->SMPR2 |= 1<<3; //ADC1通道2的采样时间设为7.5个周期
ADC2->SQR1 = 0x00000000;
ADC2->SQR2 = 0x00000000;
ADC2->SQR3 = 0x0000000B; //ADC2,规则序列寄存器只转换1个 11 通道
ADC2->JSQR = 0x00000001; //ADC2,注入序列寄存器只转换1个 1通道
BIT_ADM(ADC2->CR2, 0) = 1; //使能ADC2
BIT_ADM(ADC2->CR2, 3) = 1; //使能ADC2复位校准
while(ADC2->CR2 & 1<<3); //等待ADC2复位校准结束
BIT_ADM(ADC2->CR2, 2) = 1; //开启AD校准,该位由软件设置以开始校准
while(ADC2->CR2 & 1<<2); //等待ADC2校准结束
BIT_ADM(ADC2->CR2, 1) = 1; //ADON 开关/AD转换器
MY_NVIC_Init(1,0,ADC1_2_IRQn,4); //组4
//BIT_ADM(ADC1->CR1,5) = 1; //使能ADC1中断控制
BIT_ADM(ADC1->CR2,8) = 1; //使能ADC1 DMA传输(同步模式只有使能了DMA才能得到ADC2的值)
// MYDMA_Config(DMA1_Channel1,(u32)&ADC1->DR,(u32)ADC_Buf,ADC_SIZE);//DMA1通道设置
}
这个代码,ADC2不会采样,读出的值一直是零,哪位高手帮我看看,哪里搞错了
一周热门 更多>