ADC 转换求教

2019-07-20 23:55发布

各位老大们,本人现急需要实现,双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不会采样,读出的值一直是零,哪位高手帮我看看,哪里搞错了

0条回答

一周热门 更多>