久久久久久久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一级久久 | 亚洲精品一区中文字幕 | 欧美日韩亚洲国产 | av大片在线 | 伊人激情综合网 | 欧美一级二级在线观看 | 亚洲二区在线 | 亚洲精品电影网在线观看 | 99精品视频免费观看 | 成人久久18免费网站 | 一级在线毛片 | 91九色婷婷 | 久久1区 | 别c我啊嗯国产av一毛片 | 久久中文字幕一区 | 日日天天| 亚洲午夜视频 | 久草免费视| 久久一起草 | 狠狠狠干 | 日韩av一区二区在线观看 | www.亚洲精品 | 国产一区二区在线播放视频 | 爱爱视频日本 | 91porn在线 | 国产精品影视在线观看 | 午夜伦理影院 | 亚洲福利av | 91亚洲精品久久久电影 | 中文字幕一区二区三区不卡 | av中文字幕在线观看 | 久久高清免费视频 | 亚洲免费一区二区 | 久久久精品网 | 欧区一欧区二欧区三免费 | 久久精品日 | 国产日产欧产精品精品推荐蛮挑 | 欧美性另类 |