搜索
bottom↓
回复: 0

求助:6路AD,分成2个ADC采集,64个点采样一次,DMA内存宽度设为3*128,半传输中断,数据采集不对,请看下哪里问题?

[复制链接]

出0入13汤圆

发表于 2020-9-12 11:33:18 | 显示全部楼层 |阅读模式
6路AD,分成2个ADC采集,64个点采样一次,DMA内存宽度设为3*128,半传输中断,数据采集不对,请看下哪里问题

#define Adc_Cj_Num 128
u32 AD_Value[Adc_Cj_Num][3];
//ÕâÀïʹÓõÄÊǶ¨Ê±Æ÷4!
void TIM4_Int_Init(u16 arr,u16 psc)
{
    TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
    TIM_OCInitTypeDef TIM_OCInitStruct;
   
    RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
    TIM_TimeBaseStructure.TIM_Period = arr; //ÉèÖÃÔÚÏÂÒ»¸ö¸üÐÂʼþ×°Èë»î¶¯µÄ×Ô¶¯ÖØ×°ÔؼĴæÆ÷ÖÜÆÚµÄÖµ   
    TIM_TimeBaseStructure.TIM_Prescaler =psc; //ÉèÖÃÓÃÀ´×÷ΪTIMxʱÖÓƵÂʳýÊýµÄÔ¤·ÖƵֵ
    TIM_TimeBaseStructure.TIM_ClockDivision = TIM_CKD_DIV1; //ÉèÖÃʱÖÓ·Ö¸î:TDTS = Tck_tim
    TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIMÏòÉϼÆÊýģʽ
    TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //¸ù¾ÝÖ¸¶¨µÄ²ÎÊý³õʼ»¯TIMxµÄʱ¼ä»ùÊýµ¥Î»

    TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM1 ;
    TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_Low;
    TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
    TIM_OCInitStruct.TIM_Pulse =324/2;
    TIM_OC4Init(TIM4, &TIM_OCInitStruct);                        
    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);//TIMx_CCR1¼Ä´æÆ÷µÄԤװÔع¦ÄÜ,Enable¾ÍÊÇÏÂÒ»´Î¸üÐÂʼþʱ±»¸üУ»DisableÊÇÁ¢¼´ÉúЧ£¡£¡£¡     
    TIM_Cmd(TIM4, ENABLE);  //ʹÄÜTIMx   
    TST_GPIO_Init();
//TIM_ITConfig(TIM4,TIM_IT_Update,ENABLE ); //ʹÄÜÖ¸¶¨µÄTIM3ÖжÏ,ÔÊÐí¸üÐÂÖжÏ
}


void GPIO_Ad_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE);
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 |GPIO_Pin_1 |GPIO_Pin_2 |GPIO_Pin_3|GPIO_Pin_4 | GPIO_Pin_5;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOC, &GPIO_InitStructure);
}

void DMA_ADC_INIT(void)
{
    DMA_InitTypeDef DMA_InitStructure;
    ADC_InitTypeDef ADC_InitStructure;

    RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);   
   
    DMA_DeInit(DMA1_Channel1);                 //*DMAͨµÀ1*/
  DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;      /*ÍâÉèµØÖ·*/
  DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value[0][0]; /* ÄÚ´æµØÖ·*/
  DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;               /* DMA ´«Êä·½Ïòµ¥Ïò*/
  DMA_InitStructure.DMA_BufferSize =Adc_Cj_Num*3;                          /* ÉèÖÃDMAÔÚ´«Êäʱ»º³åÇøµÄ³¤¶È word*/
  DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; /*ÉèÖÃDMAµÄÍâÉèµÝÔöģʽ£¬Ò»¸öÍâÉè*/
  DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;         /*ÉèÖÃDMAµÄÄÚ´æµÝÔöģʽ*/
//  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;  /*ÍâÉèÊý¾Ý×Ö³¤*/
//  DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;          /*ÄÚ´æÊý¾Ý×Ö³¤*/
  DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Word;      //ÍâÉèÊý¾Ýµ¥Î»(ÿ´Î´«Êä32λ)
  DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;              //ÄÚ´æÊý¾Ýµ¥Î»(ÿ´Î´«Êä32λ)
  DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;     /*ÉèÖÃDMAµÄ´«Êäģʽ£ºÁ¬Ðø²»¶ÏµÄÑ­»·Ä£Ê½*/
  DMA_InitStructure.DMA_Priority=DMA_Priority_High; /*ÉèÖÃDMAµÄÓÅÏȼ¶±ð*/
  DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;        /*ÉèÖÃDMAµÄ2¸ömemoryÖеıäÁ¿»¥Ïà·ÃÎÊ*/
  DMA_Init(DMA1_Channel1, &DMA_InitStructure);
    DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE); //
    DMA_Cmd(DMA1_Channel1, ENABLE);

  
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC2, ENABLE);
  ADC_DeInit(ADC1);
  ADC_DeInit(ADC2);
  
  ADC_StructInit(&ADC_InitStructure);
  ADC_InitStructure.ADC_Mode =  ADC_Mode_RegSimult;  //ADC1¹¤×÷ÔÚ×¢Èëģʽ
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;         /*ENABLE-ADC¶àͨµÀɨÃè, DISABLE-ADCµ¥Í¨µÀɨÃè*/
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   /* ENABLE--ADCÁ¬Ðøת»¯Ä£Ê½ DISABLE--ADCµ¥´Îת»¯Ä£Ê½*/
  ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_T4_CC4;//ADC_ExternalTrigConv_T4_CC4;ADC_ExternalTrigConv_None    /*ADCÍⲿ¿ª¹Ø£¬¹Ø±Õ״̬*/
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   /*¶ÔÆ뷽ʽ,ADCΪ12λÖУ¬ÓÒ¶ÔÆ뷽ʽ*/
  ADC_InitStructure.ADC_NbrOfChannel =3;     /*¿ªÆôͨµÀÊý£¬3¸ö*/
  ADC_Init(ADC1, &ADC_InitStructure);
  ADC_DMACmd(ADC1, ENABLE); //ʹÄÜADC1µÄDMA
  
  ADC_StructInit(&ADC_InitStructure);
  ADC_InitStructure.ADC_Mode = ADC_Mode_RegSimult;  //ADC2¹¤×÷ÔÚ×¢Èëģʽ
  ADC_InitStructure.ADC_ScanConvMode = ENABLE;       /*ENABLE-ADC¶àͨµÀɨÃè, DISABLE-ADCµ¥Í¨µÀɨÃè*/     
  ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;   /* ENABLE--ADCÁ¬Ðøת»¯Ä£Ê½ DISABLE--ADCµ¥´Îת»¯Ä£Ê½*/
  ADC_InitStructure.ADC_ExternalTrigConv =  ADC_ExternalTrigConv_None;  //ADC_ExternalTrigConv_T4_CC4;
  ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;   /*¶ÔÆ뷽ʽ,ADCΪ12λÖУ¬ÓÒ¶ÔÆ뷽ʽ*/
  ADC_InitStructure.ADC_NbrOfChannel = 3;                //Òª½øÐÐADCת»»µÄͨµÀÊý£ºPHASE_B_ADC_CHANNEL,TEMP_FDBK_CHANNEL
  ADC_Init(ADC2, &ADC_InitStructure);
  ADC_ExternalTrigConvCmd(ADC2, ENABLE);                 //ADC2Íⲿ´¥·¢Ê¹ÄÜ£¬Ë«ADCģʽµÄ´ÓADC±ØÐëÒªÓÃÕâÌõÓï¾ä
  
  
  ADC_RegularChannelConfig(ADC1, ADC_Channel_10, 1, ADC_SampleTime_13Cycles5);   //AÏàµçÁ÷
  ADC_RegularChannelConfig(ADC1, ADC_Channel_11, 2, ADC_SampleTime_13Cycles5);   //BÏàµçÁ÷
  ADC_RegularChannelConfig(ADC1, ADC_Channel_12, 3, ADC_SampleTime_13Cycles5);   //BÏàµçÁ÷
  
  ADC_RegularChannelConfig(ADC2, ADC_Channel_13, 1, ADC_SampleTime_13Cycles5);   //»ù×¼µçѹ
  ADC_RegularChannelConfig(ADC2, ADC_Channel_14, 2, ADC_SampleTime_13Cycles5);   //ÁãÐòµçÁ÷
     ADC_RegularChannelConfig(ADC2, ADC_Channel_15, 3, ADC_SampleTime_13Cycles5);   //

    ADC_ExternalTrigConvCmd(ADC1, ENABLE); /* Ò»¶¨Òª ¿ªStart ADC1 External Conversion */
  ADC_Cmd(ADC1, ENABLE);                                   //ADC1ʹÄÜ     
  ADC_ResetCalibration(ADC1);                        //¸´Î»Ð£×¼¼Ä´æÆ÷
  while(ADC_GetResetCalibrationStatus(ADC1));       //µÈ´ýУ׼¼Ä´æÆ÷¸´Î»Íê³É
  ADC_StartCalibration(ADC1);                        //ADC1¿ªÊ¼Ð£×¼
  while(ADC_GetCalibrationStatus(ADC1));            //µÈ´ýУ׼Íê³É

  ADC_Cmd(ADC2, ENABLE);                             //ADC2ʹÄÜ
  ADC_ResetCalibration(ADC2);                        //¸´Î»Ð£×¼¼Ä´æÆ÷
  while(ADC_GetResetCalibrationStatus(ADC2));       //µÈ´ýУ׼¼Ä´æÆ÷¸´Î»Íê³É
  ADC_StartCalibration(ADC2);                        //ADC2¿ªÊ¼Ð£×¼  
  while(ADC_GetCalibrationStatus(ADC2));                   //µÈ´ýУ׼Íê³É
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-6-3 19:52

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表