|
51hei截圖20241021161025.png (17.37 KB, 下載次數(shù): 5)
下載附件
2024-10-21 16:10 上傳
- /**
- ****************************************************************************************************
- * @file adc.c
- * @author 正點(diǎn)原子團(tuán)隊(duì)(ALIENTEK)
- * @version V1.3
- * @date 2020-04-24
- * @brief ADC 驅(qū)動(dòng)代碼
- * @license Copyright (c) 2020-2032, 廣州市星翼電子科技有限公司
- ****************************************************************************************************
- * @attention
-
- *
- * 修改說(shuō)明
- * V1.0 20200423
- * 第一次發(fā)布
- * V1.1 20200423
- * 1,支持ADC單通道DMA采集
- * 2,新增adc_dma_init和adc_dma_enable函數(shù).
- * V1.2 20200423
- * 1,支持ADC多通道DMA采集
- * 2,新增adc_nch_dma_init函數(shù).
- * V1.3 20200424
- * 1,支持內(nèi)部溫度傳感器溫度采集
- * 2,新增adc_temperature_init和adc_get_temperature函數(shù).
- *
- ****************************************************************************************************
- */
- #include "./BSP/ADC/adc.h"
- //#include "./BSP/DMA/dma.h"
- #include "./SYSTEM/delay/delay.h"
- #include "./SYSTEM/usart/usart.h"
- ADC_HandleTypeDef g_adc_handle; /* ADC句柄 */
- DMA_HandleTypeDef g_dma_adc_handle; /* 與ADC關(guān)聯(lián)的DMA句柄 */
- uint8_t g_adc_dma_sta = 0; /* DMA傳輸狀態(tài)標(biāo)志, 0,未完成; 1, 已完成 */
- uint16_t g_adc_value[ADC_CH_NUM * ADC_COLL] = {0}; /* 存儲(chǔ)ADC原始值 */
- //float g_adc_u_value[ADC_CH_NUM] = {0}; /* 存儲(chǔ)ADC轉(zhuǎn)換后的電壓值 */
- /********************************************************************/
- /**
- * @brief ADC初始化函數(shù)
- * @note 本函數(shù)支持ADC1/ADC2任意通道, 但是不支持ADC3
- * 我們使用12位精度, ADC采樣時(shí)鐘=12M, 轉(zhuǎn)換時(shí)間為: 采樣周期 + 12.5個(gè)ADC周期
- * 設(shè)置最大采樣周期: 239.5, 則轉(zhuǎn)換時(shí)間 = 252 個(gè)ADC周期 = 21us
- * @param 無(wú)
- * @retval 無(wú)
- */
- void adc_init(void)
- {
- ADC_ChannelConfTypeDef sConfig = {0};
-
- g_adc_handle.Instance = ADC_ADCX;
- g_adc_handle.Init.ContinuousConvMode = ENABLE;
- g_adc_handle.Init.DataAlign = ADC_DATAALIGN_RIGHT;
- g_adc_handle.Init.DiscontinuousConvMode = DISABLE;
- g_adc_handle.Init.ExternalTrigConv = ADC_SOFTWARE_START;
- g_adc_handle.Init.NbrOfConversion = ADC_CH_NUM;
- g_adc_handle.Init.NbrOfDiscConversion = 0;
- g_adc_handle.Init.ScanConvMode = ENABLE;
- HAL_ADC_Init(&g_adc_handle);
-
- HAL_ADCEx_Calibration_Start(&g_adc_handle);//ADC校準(zhǔn)
-
- sConfig.Channel = ADC_ADCX_CH4;
- sConfig.Rank = 1;
- sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
- HAL_ADC_ConfigChannel(&g_adc_handle,&sConfig);
-
- sConfig.Channel = ADC_ADCX_CH5;
- sConfig.Rank = 2;
- sConfig.SamplingTime = ADC_SAMPLETIME_239CYCLES_5;
- HAL_ADC_ConfigChannel(&g_adc_handle,&sConfig);
-
- __HAL_LINKDMA(&g_adc_handle, DMA_Handle ,g_dma_adc_handle);
-
-
- // HAL_NVIC_SetPriority(DMA1_Channel1_IRQn,3,3);
- // HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
- //
- // HAL_DMA_Start_IT(&g_dma_adc_handle, (uint32_t)&ADC1->DR, (uint32_t)g_adc_value, ADC_CH_NUM * ADC_COLL);
- // HAL_ADC_Start_DMA(&g_adc_handle,(uint32_t *)g_adc_value,ADC_CH_NUM * ADC_COLL);
- }
- void adc_dma_init(void)
- {
- if ((uint32_t)ADC_ADCX_DMACx > (uint32_t)DMA1_Channel7) /* 大于DMA1_Channel7, 則為DMA2的通道了 */
- {
- __HAL_RCC_DMA2_CLK_ENABLE(); /* DMA2時(shí)鐘使能 */
- }
- else
- {
- __HAL_RCC_DMA1_CLK_ENABLE(); /* DMA1時(shí)鐘使能 */
- }
-
- g_dma_adc_handle.Instance = DMA1_Channel1;
- g_dma_adc_handle.Init.Direction = DMA_PERIPH_TO_MEMORY;
- g_dma_adc_handle.Init.MemDataAlignment = DMA_MDATAALIGN_HALFWORD;
- g_dma_adc_handle.Init.MemInc = DMA_MINC_ENABLE;
- g_dma_adc_handle.Init.Mode = DMA_NORMAL;
- g_dma_adc_handle.Init.PeriphDataAlignment = DMA_PDATAALIGN_HALFWORD;
- g_dma_adc_handle.Init.PeriphInc = DMA_PINC_DISABLE;
- g_dma_adc_handle.Init.Priority = DMA_PRIORITY_MEDIUM;
- HAL_DMA_Init(&g_dma_adc_handle);
-
- // __HAL_LINKDMA(&g_adc_handle, DMA_Handle ,g_dma_adc_handle);
-
-
- HAL_NVIC_SetPriority(DMA1_Channel1_IRQn,1,3);
- HAL_NVIC_EnableIRQ(DMA1_Channel1_IRQn);
-
- // HAL_DMA_Start_IT(&g_dma_adc_handle, (uint32_t)&ADC1->DR, (uint32_t)g_adc_value, ADC_CH_NUM * ADC_COLL);
- HAL_ADC_Start_DMA(&g_adc_handle,(uint32_t *)g_adc_value,ADC_CH_NUM * ADC_COLL);
-
- // if (HAL_ADC_Start_DMA(&g_adc_handle, (uint32_t *)g_adc_value, ADC_CH_NUM * ADC_COLL) != HAL_OK)
- //{
- // // 處理錯(cuò)誤
- // printf("error");
- //}
- }
- /**
- * @brief ADC底層驅(qū)動(dòng),引腳配置,時(shí)鐘使能
- 此函數(shù)會(huì)被HAL_ADC_Init()調(diào)用
- * @param hadc:ADC句柄
- * @retval 無(wú)
- */
- void HAL_ADC_MspInit(ADC_HandleTypeDef *hadc)
- {
- if(hadc->Instance == ADC_ADCX)
- {
- GPIO_InitTypeDef GPIO_Initure;
-
- ADC_ADCX_CHY_CLK_ENABLE(); //adc時(shí)鐘
-
- ADC_ADCX_CH4_GPIO_CLK_ENABLE(); /* 開(kāi)啟GPIO時(shí)鐘 */
- ADC_ADCX_CH5_GPIO_CLK_ENABLE(); /* 開(kāi)啟GPIO時(shí)鐘 */
-
- /* AD采集引腳模式設(shè)置,模擬輸入 */
- GPIO_Initure.Pin = ADC_ADCX_CH4_GPIO_PIN;
- GPIO_Initure.Mode = GPIO_MODE_ANALOG;
- GPIO_Initure.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(ADC_ADCX_CH4_GPIO_PORT, &GPIO_Initure);
-
- /* AD采集引腳模式設(shè)置,模擬輸入 */
- GPIO_Initure.Pin = ADC_ADCX_CH5_GPIO_PIN;
- GPIO_Initure.Mode = GPIO_MODE_ANALOG;
- GPIO_Initure.Pull = GPIO_PULLUP;
- HAL_GPIO_Init(ADC_ADCX_CH5_GPIO_PORT, &GPIO_Initure);
-
-
- //ADC時(shí)鐘初始化
- RCC_PeriphCLKInitTypeDef adc_clk_init = {0};
- adc_clk_init.PeriphClockSelection = RCC_PERIPHCLK_ADC;
- adc_clk_init.AdcClockSelection = RCC_ADCPCLK2_DIV6;
- HAL_RCCEx_PeriphCLKConfig(&adc_clk_init);
- }
- }
- void ADC_ADCX_DMASX_IRQHandler(void)
- {
- HAL_DMA_IRQHandler(&g_dma_adc_handle);
- g_adc_dma_sta = 1; // 標(biāo)記DMA傳輸完成
- }
- uint16_t g_adc_val[ADC_CH_NUM];
- void HAL_ADC_ConvCpltCallback(ADC_HandleTypeDef *hadc)
- {
- uint32_t temp;
- if(hadc->Instance == ADC_ADCX)
- {
-
- // print_adc_values();
- HAL_ADC_Stop_DMA(hadc);
- calc_adc_val(g_adc_val);
- HAL_ADC_Start_DMA(&g_adc_handle,(uint32_t *)&g_adc_value,ADC_SUM);
- }
- }
- //void print_adc_values(void)
- //{
- // // 確保在打印之前進(jìn)行數(shù)據(jù)校驗(yàn),例如檢查數(shù)據(jù)個(gè)數(shù)和有效性
- // for (int i = 0; i < ADC_CH_NUM * ADC_COLL; i++)
- // {
- // // 確認(rèn)數(shù)組中的數(shù)據(jù)是否有效
- // if (g_adc_value[i] != 0) // 例如,不等于0表示有效
- // {
- // printf("g_adc_value[%d]: %u\r\n", i, g_adc_value[i]);
- // }
- // }
- //}
- /**
- * @brief 獲取通道ch的轉(zhuǎn)換值,取times次, 然后平均
- * @param ch: 通道號(hào), 0~17
- * @retval 通道ch的times次轉(zhuǎn)換結(jié)果平均值
- */
- uint32_t adc_get_result_average(uint8_t ch)
- {
- uint32_t temp_val = 0;
- uint16_t t;
-
- for(t = ch; t < ADC_SUM; t += ADC_CH_NUM)
- {
- temp_val += g_adc_value[t];
- }
-
- return temp_val / ADC_COLL;
- }
- /**
- * @brief 計(jì)算ADC的平均值(濾波)
- * @param * p :存放ADC值的指針地址
- * @note 此函數(shù)對(duì)電壓、溫度、電流對(duì)應(yīng)的ADC值進(jìn)行濾波
- * @retval 無(wú)
- */
- void calc_adc_val(uint16_t * p)
- {
- uint32_t temp[ADC_CH_NUM] = {0,0}; /* 定義一個(gè)緩存數(shù)組 */
- int i,j;
- for(i = 0; i < ADC_COLL; i++) /* 循環(huán)采集ADC_COLL次數(shù) */
- {
- for(j = 0; j < ADC_CH_NUM; j++) /* 根據(jù)ADC通道數(shù)循環(huán)獲取,并累加 */
- {
- temp[j] += g_adc_value[j+i*ADC_CH_NUM]; /* 將采集到的ADC值,各通道進(jìn)行累加 */
- }
- }
- for(j = 0; j < ADC_CH_NUM; j++)
- {
- temp[j] /= ADC_COLL; /* 獲取平均值 */
- p[j] = temp[j]; /* 存到*p */
- }
- }
- /**
- ****************************************************************************************************
- * @file main.c
- * @author 正點(diǎn)原子團(tuán)隊(duì)(ALIENTEK)
- * @version V1.0
- * @date 2020-04-24
- * @brief SPI 實(shí)驗(yàn)
- * @license Copyright (c) 2020-2032, 廣州市星翼電子科技有限公司
- ****************************************************************************************************
- * @attention
- *
- * 實(shí)驗(yàn)平臺(tái):正點(diǎn)原子 STM32F103開(kāi)發(fā)板
- *
- ****************************************************************************************************
- */
- #include "./SYSTEM/sys/sys.h"
- #include "./SYSTEM/usart/usart.h"
- #include "./SYSTEM/delay/delay.h"
- #include "./USMART/usmart.h"
- #include "./BSP/LED/led.h"
- #include "./BSP/LCD/lcd.h"
- #include "./BSP/KEY/key.h"
- #include "./BSP/NORFLASH/norflash.h"
- #include "./BSP/SPI/spi.h"
- #include "./BSP/ICM42688/icm42688.h"
- #include "./BSP/ESP8266USART/esp8266usart.h"
- #include "./BSP/ESP8266/esp8266.h"
- #include "./BSP/ADC/adc.h"
- //int time=50;
- int8_t accel1[3];
- int16_t accel[3];
- int16_t gyro[3];
- int16_t adc_result[ADC_CH_NUM];
- //uint8_t ret;
- uint8_t *frame = NULL;
- uint8_t result;
- extern uint16_t g_adc_value[ADC_CH_NUM * ADC_COLL] ;
- extern uint16_t g_adc_val[ADC_CH_NUM];
- extern uint8_t g_adc_dma_sta;
- extern ADC_HandleTypeDef g_adc_handle; /* ADC句柄 */
- int main(void)
- {
- HAL_Init(); /* 初始化HAL庫(kù) */
- sys_stm32_clock_init(RCC_PLL_MUL9); /* 設(shè)置時(shí)鐘, 72Mhz */
- delay_init(72); /* 延時(shí)初始化 */
- usart_init(115200); /* 串口初始化為115200 */
- // usmart_dev.init(72); /* 初始化USMART */
- // led_init(); /* 初始化LED */
- // key_init(); /* 初始化按鍵 */
-
- spi2_init();
- Icm42688_Init();
- // ICM42688_Connect();
-
- esp8266_uart_init(115200);
-
- adc_init();
- adc_dma_init();
- //
- // // 等待DMA傳輸完成
- // while (!g_adc_dma_sta)
- // {
- // // 等待DMA傳輸完成
- // printf("Waiting for DMA transfer to complete...\r\n");
- // }
- // // 輸出第一個(gè)ADC值
- // printf("g_adc_value[0]:%d\r\n", g_adc_value[0]);
- // ESP8266_EN(0);
- // result = esp8266_Init(115200);
- // printf("result:%d\r\n",result);
- // result = esp8266_send_at_cmd("AT","OK",500);
- // printf("result:%d\r\n",result);
-
-
- // 連接wifi成功
- // result = esp8266_join_ap("xiao","312312312");
- // printf("result:%d\r\n",result);
- //for(int i = 0; i < 2 ;i++)
- //{
- // printf("g_adc_value[%d]:%u\r\n",i,g_adc_val[i]);
- //}
- // printf("wraeyrut");
- // printf("g_adc_value");
- // printf("x,y:%u\r\n",g_adc_val[0]);
- while (1)
- {
-
- //多通道ADC轉(zhuǎn)化,沒(méi)有DMA
- // uint16_t adcx;
- // adcx = adc_get_result(adc_result);
- // printf("adcx:%d,adcy:%d,\r\n",adc_result[0],adc_result[1]);
-
- printf("adcx:%d,adcy:%d\r\n",g_adc_val[0],g_adc_val[1]);
-
-
-
-
-
-
- // //測(cè)試串口3是否正常
- // //測(cè)試串口3是否正常
- // //測(cè)試串口3是否正常
- // frame = esp8266_uart_rx_get_frame();
- // if (frame != NULL) {
- // // 處理接收到的數(shù)據(jù),這里假設(shè)我們要打印接收到的數(shù)據(jù)
- // esp8266_uart_printf("Received: %s\r\n", frame);
- // // 處理完之后,重置接收狀態(tài)
- // esp8266_uart_rx_restart(); // 重新啟動(dòng)接收
- // } else {
- // // 如果沒(méi)有接收到完整數(shù)據(jù),可以選擇處理超時(shí)或者其他邏輯
- // esp8266_uart_printf("No complete frame received yet.\r\n");
- // }
-
- // esp8266_uart_printf("AT\r\n");
- // printf("456\r\n");
- // delay_ms(1000);
- // frame = esp8266_uart_rx_get_frame();
- // printf("frame:%s\r\n",frame);
- // printf("123\r\n");
-
-
-
-
- //測(cè)試ICM42688
- // ICM42688_Read_Data(accel,gyro);
- // printf("gyro_x:%d gyro_y:%d gyro_z:%d\r\n",gyro[0],gyro[1],gyro[2]);
- // printf("accel_x:%d accel_y:%d accel_z:%d\r\n",accel[0],accel[1],accel[2]);
- // delay_ms(1000);
-
- }
- }
復(fù)制代碼 |
|