久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 1630|回復: 2
打印 上一主題 下一主題
收起左側

STM32F4單片機定時器觸發adc采樣 DMA傳輸長度1024個數 緩存區內只有一半數據問題

[復制鏈接]
跳轉到指定樓層
樓主
ID:973561 發表于 2023-5-29 19:28 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
STM32F4 定時器觸發adc采樣 DMA傳輸長度1024個數  aADCxConvertedData緩存區內只有一半數據 前512是ad模擬量 后一半全是0

  1. void MX_ADC1_Init(void)
  2. {

  3.   /* USER CODE BEGIN ADC1_Init 0 */

  4.   /* USER CODE END ADC1_Init 0 */

  5.   ADC_ChannelConfTypeDef sConfig = {0};

  6.   /* USER CODE BEGIN ADC1_Init 1 */

  7.   /* USER CODE END ADC1_Init 1 */

  8.   /** Configure the global features of the ADC (Clock, Resolution, Data Alignment and number of conversion)
  9.   */
  10.   hadc1.Instance = ADC1;
  11.   hadc1.Init.ClockPrescaler = ADC_CLOCK_SYNC_PCLK_DIV6;  //6分頻 最小采樣周期2.5 + 12.5固定周期 采樣一次1微秒
  12.   hadc1.Init.Resolution = ADC_RESOLUTION_12B;
  13.   hadc1.Init.ScanConvMode = DISABLE;
  14.   hadc1.Init.ContinuousConvMode = DISABLE;   //ENABLE
  15.   hadc1.Init.DiscontinuousConvMode = DISABLE;
  16.   hadc1.Init.ExternalTrigConvEdge = ADC_EXTERNALTRIGCONVEDGE_RISING;
  17.   hadc1.Init.ExternalTrigConv = ADC_EXTERNALTRIGCONV_T3_TRGO;
  18.   hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;
  19.   hadc1.Init.NbrOfConversion = 1;
  20.   hadc1.Init.DMAContinuousRequests = ENABLE;
  21.   hadc1.Init.EOCSelection = ADC_EOC_SEQ_CONV ;
  22.   if (HAL_ADC_Init(&hadc1) != HAL_OK)
  23.   {
  24.     Error_Handler();
  25.   }

  26.   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  27.   */
  28. //  sConfig.Channel = ADC_CHANNEL_2;
  29. //  sConfig.Rank = 1;
  30. //  sConfig.SamplingTime = ADC_SAMPLETIME_28CYCLES;
  31. //  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  32. //  {
  33. //    Error_Handler();
  34. //  }

  35.   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  36.   */
  37. //  sConfig.Channel = ADC_CHANNEL_3;
  38. //  sConfig.Rank = 2;
  39. //  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  40. //  {
  41. //    Error_Handler();
  42. //  }

  43.   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  44.   */
  45. //  sConfig.Channel = ADC_CHANNEL_1;
  46. //  sConfig.Rank = 3;
  47. //  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  48. //  {
  49. //    Error_Handler();
  50. //  }

  51.   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  52.   */
  53. //  sConfig.Channel = ADC_CHANNEL_12;
  54. //  sConfig.Rank = 4;
  55. //  if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  56. //  {
  57. //    Error_Handler();
  58. //  }

  59.   /** Configure for the selected ADC regular channel its corresponding rank in the sequencer and its sample time.
  60.   */
  61.   sConfig.Channel = ADC_CHANNEL_13;
  62.         sConfig.SamplingTime = ADC_SAMPLETIME_15CYCLES;
  63.   sConfig.Rank = 1;
  64.   if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK)
  65.   {
  66.     Error_Handler();
  67.   }
  68.   /* USER CODE BEGIN ADC1_Init 2 */

  69.   /* USER CODE END ADC1_Init 2 */
  70. //          HAL_DMA_Abort_IT(&hdma_adc1);
  71.     __HAL_DMA_ENABLE_IT(&hdma_adc1,DMA_IT_TC);    //開啟傳輸完成中斷
  72. //    HAL_ADC_Start_IT(&hadc1);



  73. }


  74. void HAL_ADC_MspInit(ADC_HandleTypeDef* adcHandle)
  75. {

  76.   GPIO_InitTypeDef GPIO_InitStruct = {0};
  77.   if(adcHandle->Instance==ADC1)
  78.   {
  79.   /* USER CODE BEGIN ADC1_MspInit 0 */

  80.   /* USER CODE END ADC1_MspInit 0 */
  81.     /* ADC1 clock enable */
  82.     __HAL_RCC_ADC1_CLK_ENABLE();

  83.     __HAL_RCC_GPIOC_CLK_ENABLE();
  84.     __HAL_RCC_GPIOA_CLK_ENABLE();
  85.     /**ADC1 GPIO Configuration
  86.     PC2     ------> ADC1_IN12
  87.     PC3     ------> ADC1_IN13
  88.     PA1     ------> ADC1_IN1
  89.     PA2     ------> ADC1_IN2
  90.     PA3     ------> ADC1_IN3
  91.     */
  92.     GPIO_InitStruct.Pin = GPIO_PIN_2|GPIO_PIN_3;
  93.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  94.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  95.     HAL_GPIO_Init(GPIOC, &GPIO_InitStruct);

  96.     GPIO_InitStruct.Pin = GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3;
  97.     GPIO_InitStruct.Mode = GPIO_MODE_ANALOG;
  98.     GPIO_InitStruct.Pull = GPIO_NOPULL;
  99.     HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

  100.     /* ADC1 DMA Init */
  101.     /* ADC1 Init */
  102.     hdma_adc1.Instance = DMA2_Stream0;
  103.     hdma_adc1.Init.Channel = DMA_CHANNEL_0;
  104.     hdma_adc1.Init.Direction = DMA_PERIPH_TO_MEMORY;
  105.     hdma_adc1.Init.PeriphInc = DMA_PINC_DISABLE;
  106.     hdma_adc1.Init.MemInc = DMA_MINC_ENABLE;
  107.     hdma_adc1.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
  108.     hdma_adc1.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
  109.     hdma_adc1.Init.Mode = DMA_NORMAL; //一般模式 DMA_NORMAL    //DMA_CIRCULAR  循環模式
  110.     hdma_adc1.Init.Priority = DMA_PRIORITY_HIGH;
  111.     hdma_adc1.Init.FIFOMode = DMA_FIFOMODE_DISABLE;
  112.     if (HAL_DMA_Init(&hdma_adc1) != HAL_OK)
  113.     {
  114.       Error_Handler();
  115.     }

  116.     __HAL_LINKDMA(adcHandle,DMA_Handle,hdma_adc1);

  117.   /* USER CODE BEGIN ADC1_MspInit 1 */
  118.     /* ADC1 interrupt Init */
  119. //    HAL_NVIC_SetPriority(ADC_IRQn, 5, 0);
  120. //    HAL_NVIC_EnableIRQ(ADC_IRQn);
  121.   /* USER CODE END ADC1_MspInit 1 */
  122.   }
  123. }








  124. void DMA2_Stream0_IRQHandler(void)
  125. {
  126. /* USER CODE BEGIN 2 */
  127. //           HAL_ADC_Stop_DMA(&hadc1);

  128. /* USER CODE BEGIN 2 */     //需要判斷DMA是否傳輸完成 如果傳輸完成在繼續
  129. //    if(__HAL_DMA_GET_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4)!=RESET)//DMA傳輸完成
  130. //                {
  131. //        __HAL_DMA_CLEAR_FLAG(&hdma_adc1,DMA_FLAG_TCIF0_4);//清除DMA傳輸完成中斷標志位
  132.                
  133.                          HAL_TIM_Base_Stop (&htim3);
  134.                         
  135.                          ADC_Conver_flag = 1; //傳輸完成標志位
  136.                         
  137.                          ADConve_CNT++;
  138.                         
  139.                          if(ADConve_CNT > 1024)
  140.                          {
  141.                            ADConve_CNT = 0;
  142.                          }
  143.                         
  144. //                }
  145.                
  146.                   HAL_DMA_IRQHandler(&hdma_adc1);
  147.                         

  148.                         
  149. }


  150. void Task1_AdcConverted(void)   //任務1  ->   adc采集任務
  151. {
  152.         float adc_VreValue1 = 0;
  153.         float adc_result1 = 0;
  154.         float adc_VreValue2 = 0;
  155.         float adc_power_value = 0;
  156.         static u16 i = 0;
  157.   if(ADC_Conver_flag == 1)                           //轉化完成標志位
  158.                 {                                                  
  159.        printf("***************adc轉化成功**********************\r\n");
  160.                          ADC_Conver_flag = 0;                          ////轉化完成標志位   
  161.        //抽取數據
  162. //                         Get_AdcVaule_arry(aADCxConvertedData,ADC_POWER_Value,ADC_1_Value_DMA,ADC_CONVERTED_DATA_BUFFER_SIZE) ;  //抽取數據
  163.                         
  164. //                         adc_VreValue1 = MedianFilteringForSensor(ADC_POWER_Value,1024);  //中值濾波
  165.                         
  166. //                         adc_result1 = moving_average_filtre(adc_VreValue1);  //滑動濾波算法
  167.                                  
  168. //                         adc_power_value = (float) adc_VreValue1*(float)3.3/4096;
  169.                           

  170.          for(i = 0;i < 1024 ; i++)
  171.                                  {
  172.                                    printf("%d \r\n ", aADCxConvertedData[i]);
  173. //                                         printf("%d \r\n ", i);
  174.            delay_ms(30);                                 
  175.                                  }
  176.                         
  177.                            
  178. //                           printf("基準電壓power = %0.2f\r\n ", adc_power_value);
  179. ////                         printf("ad_value = %0.2f\r\n ", adc_VreValue2);
  180. //                           printf("轉換次數= %d \r\n ", ADConve_CNT);
  181. //                         clean_buff(aADCxConvertedData ,ADC_CONVERTED_DATA_BUFFER_SIZE );
  182.                                                          
  183. //       HAL_TIM_Base_Start(&htim3);  //使用定時器3啟動adc采樣
  184.        delay_ms(1000);
  185.                    printf("*************************************\r\n");
  186. //                                
  187. //      Get_AdcVaule_arry(u16 * INPUT_pDst,ADC_POWER_Value,u16 * OUTPUT_BUF2,u16 nums) ;
  188. //                           
  189.                                                                                    
  190.                 }
  191. }



  192. int main(void)
  193. {
  194.   /* USER CODE BEGIN 1 */
  195. //   u16 i = 0;
  196.    u8 sys_cnt = 0;
  197.   /* USER CODE END 1 */

  198.   /* MCU Configuration--------------------------------------------------------*/
  199.   /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  200.   HAL_Init();

  201.   /* USER CODE END Init */
  202.   /* Configure the system clock */
  203.   SystemClock_Config();
  204.   /* USER CODE BEGIN SysInit */
  205.   /* USER CODE END SysInit */
  206.   /* Initialize all configured peripherals */
  207.   MX_GPIO_Init();
  208.           /* USER CODE BEGIN SysInit */
  209.   MX_DMA_Init();
  210.           /* USER CODE BEGIN SysInit */
  211.   MX_ADC1_Init();
  212.         /* USER CODE BEGIN SysInit */
  213.   MX_TIM3_Init();   //觸發ADC 的時鐘
  214.         /* USER CODE BEGIN SysInit */
  215.   MX_TIM4_Init();   //通用定時器1ms中斷
  216.         /* USER CODE BEGIN SysInit */
  217.   MX_UART5_Init();  //485接口
  218.         /* USER CODE BEGIN SysInit */
  219.   MX_USART1_UART_Init();//備用
  220.         /* USER CODE BEGIN SysInit */
  221.   MX_IWDG_Init(64,1000);//分頻數為64,重載值為500,溢出時間為1s  1000為兩秒
  222.   /* USER CODE END 2 */
  223.   TIM2_PWM_Init(1000-1,84-1);            //84M/84=1M的計數頻率,自動重裝載為 ARR,那么PWM頻率為   1M /ARR =  f HZ
  224.           /* USER CODE BEGIN 2 */
  225.         HAL_TIM_Base_Start(&htim3);  //使用定時器3啟動adc采樣
  226.         //adc啟動DMA采樣
  227.         HAL_ADC_Start_DMA(&hadc1,(uint32_t *)aADCxConvertedData,1024);

  228.         printf("********RUN*******\r\n");
  229.         delay_ms(100);
  230.   /* Infinite loop */
  231.   /* USER CODE BEGIN WHILE */
  232.   while (1)
  233.   {
  234.                         /* USER CODE END WHILE */
  235.                         Task1_AdcConverted();   //任務1  ->   adc采集任務

  236.                         /* USER CODE END WHILE */
  237. //                        Task2_Modubus();     //任務2  ->   Modubus任務
  238.                
  239.             /* USER CODE END WHILE */ //本次任務結束
  240.                   sys_cnt++;               
  241.                   if(sys_cnt > 20)
  242.                         {
  243.                            sys_cnt = 0;
  244.                         }
  245.                
  246.                         delay_ms(100);                        
  247. //                        printf("***************程序運行中**********************\r\n");
  248.                   
  249.     /* USER CODE BEGIN 3 */
  250.   }
  251.   /* USER CODE END 3 */
  252. }
復制代碼
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩
回復

使用道具 舉報

沙發
ID:298093 發表于 2023-9-13 20:14 | 只看該作者
我也遇到同樣問題,不知道你解決了沒
回復

使用道具 舉報

板凳
ID:883242 發表于 2023-9-13 21:02 | 只看該作者
趕腳你對DMA的認識有非常大的誤解,ADConve_CNT是進行了多少次DMA傳輸的意思,但是你理解成每次ADC結束后都要進入一次DMA傳輸完成中斷(TC)。你應該把DMA那部分內容讀一遍。
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日韩一二三区视频 | 久久伊人精品一区二区三区 | 999久久久国产精品 欧美成人h版在线观看 | 久久久久久国产一区二区三区 | 偷派自拍 | 久久尤物免费一区二区三区 | 一区二区视频在线 | 亚洲一区在线播放 | 日韩视频国产 | 亚洲精品电影在线观看 | 天天操天天干天天爽 | 精品成人av | 黄色在线观看 | 国产免费一区二区 | 日韩插插 | 国产精华一区 | 乳色吐息在线观看 | 成人在线视频免费观看 | 国产高清视频 | 国产免费拔擦拔擦8x高清 | 在线成人www免费观看视频 | 麻豆毛片 | 啪一啪在线视频 | 九九热这里 | 久久久av | 国产成人精品一区二区三区视频 | 亚洲欧美中文日韩在线v日本 | 精品欧美一区二区在线观看视频 | 在线日韩 | 国产美女特级嫩嫩嫩bbb片 | 成人精品一区二区三区 | 国产91在线 | 欧美 | 国产一级片久久久 | 国产成人jvid在线播放 | аⅴ资源新版在线天堂 | 毛片一区 | 亚洲欧美中文日韩在线v日本 | 91亚洲国产成人精品一区二三 | 91爱啪啪| 亚洲高清av在线 | 久久综合伊人 |