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

標題: STM32F103兩路AD同時檢測并通過串口顯示程序 [打印本頁]

作者: awer    時間: 2019-2-20 15:20
標題: STM32F103兩路AD同時檢測并通過串口顯示程序
經過測試,完全可用

單片機源程序如下:
  1. #include "adc.h"
  2. #include "SysTick.h"
  3. #define ADC1_DR_Address ((u32)0x40012400+0x4c)
  4. uint16_t ADC_ConvertedValue[3];
  5. /*******************************************************************************
  6. * 函 數 名         : ADCx_Init
  7. * 函數功能                     : ADC初始化       
  8. * 輸    入         : 無
  9. * 輸    出         : 無
  10. *******************************************************************************/
  11. void ADCx_Init(void)
  12. {
  13.         GPIO_InitTypeDef GPIO_InitStructure; //定義結構體變量       
  14.         ADC_InitTypeDef  ADC_InitStructure;
  15.         DMA_InitTypeDef DMA_InitStructure;
  16.         RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOA|RCC_APB2Periph_ADC1|RCC_APB2Periph_AFIO,ENABLE);       
  17.         RCC_ADCCLKConfig(RCC_PCLK2_Div6);//設置ADC分頻因子6 72M/6=12,ADC最大時間不能超過14M
  18.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE);
  19.        
  20.         DMA_DeInit(DMA1_Channel1);
  21.         DMA_InitStructure.DMA_PeripheralBaseAddr =(u32)&ADC1->DR;
  22.         DMA_InitStructure.DMA_MemoryBaseAddr =(u32)&ADC_ConvertedValue;
  23.         DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
  24.         DMA_InitStructure.DMA_BufferSize = 2;                                       
  25.         DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  26.         DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;      
  27.         DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  28.         DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  29.         DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
  30.         DMA_InitStructure.DMA_Priority = DMA_Priority_High;
  31.         DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
  32.         DMA_Init(DMA1_Channel1, &DMA_InitStructure);
  33.         DMA_Cmd(DMA1_Channel1, ENABLE);
  34.        
  35.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
  36.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模擬輸入
  37.         //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  38.         GPIO_Init(GPIOA,&GPIO_InitStructure);
  39.        
  40.         GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1;//ADC
  41.         GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AIN;        //模擬輸入
  42.         //GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
  43.         GPIO_Init(GPIOB,&GPIO_InitStructure);       

  44.         ADC_DeInit(ADC1);//?? ADC1,?? ADC1,
  45.         ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
  46.         ADC_InitStructure.ADC_ScanConvMode = ENABLE;//掃描模式       
  47.         ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;//開啟連續轉換
  48.         ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;//禁止觸發檢測,使用軟件觸發
  49.         ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;//右對齊       
  50.         ADC_InitStructure.ADC_NbrOfChannel = 2;//1個轉換在規則序列中 也就是只轉換規則序列1
  51.         ADC_Init(ADC1, &ADC_InitStructure);//ADC初始化
  52.        
  53.         ADC_DMACmd(ADC1, ENABLE);
  54.         ADC_Cmd(ADC1, ENABLE);//開啟AD轉換器
  55.        
  56.         ADC_ResetCalibration(ADC1);//重置指定的ADC的校準寄存器
  57.         while(ADC_GetResetCalibrationStatus(ADC1));//獲取ADC重置校準寄存器的狀態
  58.        
  59.         ADC_StartCalibration(ADC1);//開始指定ADC的校準狀態
  60.         while(ADC_GetCalibrationStatus(ADC1));//獲取指定ADC的校準程序

  61.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能或者失能指定的ADC的軟件轉換啟動功能
  62. }

  63. /*******************************************************************************
  64. * 函 數 名         : Get_ADC_Value
  65. * 函數功能                   : 獲取通道ch的轉換值,取times次,然后平均        
  66. * 輸    入         : ch:通道編號
  67.                                          times:獲取次數
  68. * 輸    出         : 通道ch的times次轉換結果平均值
  69. *******************************************************************************/
  70. u16 Get_ADC_Value(u8 ch,u8 times)
  71. {
  72.         u32 temp_val=0;
  73.         u8 t;
  74.         //設置指定ADC的規則組通道,一個序列,采樣時間
  75.         ADC_RegularChannelConfig(ADC1, ch, 1, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5個周期,提高采樣時間可以提高精確度                            
  76.        
  77.         for(t=0;t<times;t++)
  78.         {
  79.                 //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的軟件轉換啟動功能       
  80.                 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉換結束
  81.                 //temp_val+=ADC_GetConversionValue(ADC1);
  82.                 temp_val+=ADC_ConvertedValue[0];
  83.                 delay_ms(5);
  84.         }
  85.         return temp_val/times;
  86. }
  87. u16 Get_ADC1_Value(u8 ch,u8 times)
  88. {
  89.         u32 temp_val=0;
  90.         u8 t;
  91.         //設置指定ADC的規則組通道,一個序列,采樣時間
  92.         ADC_RegularChannelConfig(ADC1, ch, 2, ADC_SampleTime_239Cycles5);        //ADC1,ADC通道,239.5個周期,提高采樣時間可以提高精確度                            
  93.        
  94.         for(t=0;t<times;t++)
  95.         {
  96.                 //ADC_SoftwareStartConvCmd(ADC1, ENABLE);//使能指定的ADC1的軟件轉換啟動功能       
  97.                 while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_EOC ));//等待轉換結束
  98.                 //temp_val+=ADC_GetConversionValue(ADC1);
  99.                 temp_val+=ADC_ConvertedValue[1];
  100.                 delay_ms(5);
  101.         }
  102.         return temp_val/times;
  103. }
復制代碼
  1. #include "system.h"
  2. #include "SysTick.h"
  3. #include "led.h"
  4. #include "usart.h"
  5. #include "adc.h"


  6. /*******************************************************************************
  7. * 函 數 名         : main
  8. * 函數功能                   : 主函數
  9. * 輸    入         : 無
  10. * 輸    出         : 無
  11. *******************************************************************************/
  12. int main()
  13. {
  14.         u8 i=0;
  15.         u16 value=0;
  16.         float vol;
  17.         u16 value1=0;
  18.         float vol1;
  19.         SysTick_Init(72);
  20.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中斷優先級分組 分2組
  21.         LED_Init();
  22.         USART1_Init(9600);
  23.         ADCx_Init();
  24.        
  25.         while(1)
  26.         {
  27.                 i++;
  28.                 if(i%20==0)
  29.                 {
  30.                         led1=!led1;
  31.                 }
  32.                
  33.                 if(i%50==0)
  34.                 {
  35.                         value1=Get_ADC1_Value(ADC_Channel_9,20);
  36.                         value=Get_ADC_Value(ADC_Channel_1,20);
  37.                         //printf("檢測AD值為:%d\r\n",value);
  38.                         vol=(float)value*(3.3/4096);
  39.                         vol1=(float)value1*(3.3/4096);
  40.                         printf("檢測電壓值為:%.2fV\r\n",vol1);
  41.                         printf("檢測電壓值為:%.2fV\r\n",vol);
  42.                 }
  43.                 delay_ms(10);       
  44.         }
  45. }
復制代碼


所有資料51hei提供下載:
兩路ADC帶DMA模數轉換.7z (185.71 KB, 下載次數: 75)










歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 国产精品久久久久久久午夜片 | 久久性 | 亚洲精品一区二区二区 | 久久精品国产一区二区三区 | 在线观看免费高清av | 91 在线| 免费网站国产 | 亚洲一区二区三区四区五区中文 | 国产成人a亚洲精品 | 日韩中文一区二区三区 | 免费观看的av | 国产欧美日韩综合精品一区二区 | 超碰一区二区 | 亚洲欧美中文日韩在线v日本 | 日韩三级在线 | 欧美精品第一页 | 成人区一区二区三区 | 欧美精品三区 | 久久亚洲一区二区三区四区 | 在线播放一区二区三区 | 天堂久久网| 国产免费国产 | 一级a毛片 | 午夜成人免费视频 | 黄色大片免费播放 | 97成人在线| 国产一区二区三区 | 国产91中文| 成人精品一区二区三区中文字幕 | 91精品国产色综合久久 | 五月天婷婷狠狠 | 一级毛片色一级 | 天天操天天插 | 日韩精品一区二区三区四区 | 亚洲一在线 | 韩国av网站在线观看 | h视频在线免费观看 | 激情国产视频 | 欧美精品在线一区 | 精品国产乱码久久久久久丨区2区 | 中文字幕在线一区二区三区 |