找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2470|回复: 0
打印 上一主题 下一主题
收起左侧

stm32采集12路电压源码

[复制链接]
跳转到指定楼层
楼主
ID:76293 发表于 2017-12-5 20:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
stm32采集12路电压单片机源程序如下:
  1. #include "system.h"
  2. #include "SysTick.h"
  3. #include "systick.h"
  4. #include "led.h"
  5. #include "usart.h"
  6. #include "adc.h"
  7. #include "stm32f10x_gpio.h"
  8. #define N 50
  9. #define M 12
  10. u16 value1[12];
  11. float GetVolt(u16 advalue);
  12. void filter(void);
  13. u16 After_filter[12]; //?????????????
  14. u8 i;
  15. u16 AD_Value[N][M]; //????ADC????,??DMA?????
  16. void GPIO_Configuration(void);
  17. void DMA_Configuration(void);
  18. void RCC_Configuration(void);
  19. void RCC_Configuration(void)
  20. {
  21. ErrorStatus HSEStartUpStatus;
  22. RCC_DeInit(); //RCC ????
  23. RCC_HSEConfig(RCC_HSE_ON); //??HSE
  24. HSEStartUpStatus = RCC_WaitForHSEStartUp(); //??HSE???
  25. if(HSEStartUpStatus == SUCCESS)
  26. {
  27. FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable); //Enable Prefetch Buffer
  28. FLASH_SetLatency(FLASH_Latency_2); //Set 2 Latency cycles
  29. RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHB clock = SYSCLK
  30. RCC_PCLK2Config(RCC_HCLK_Div1); //APB2 clock = HCLK
  31. RCC_PCLK1Config(RCC_HCLK_Div2); //APB1 clock = HCLK/2
  32. RCC_PLLConfig(RCC_PLLSource_HSE_Div1, RCC_PLLMul_6); //PLLCLK = 12MHz * 6 = 72 MHz
  33. RCC_PLLCmd(ENABLE); //Enable PLL
  34. while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET); //Wait till PLL is ready
  35. RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK); //Select PLL as system clock source
  36. while(RCC_GetSYSCLKSource() != 0x08); //Wait till PLL is used as system clock source
  37. RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB
  38. | RCC_APB2Periph_GPIOC |RCC_APB2Periph_ADC1 | RCC_APB2Periph_AFIO |RCC_APB2Periph_USART1, ENABLE ); //??ADC1????,??????
  39. RCC_ADCCLKConfig(RCC_PCLK2_Div6); //72M/6=12,ADC????????14M
  40. RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1, ENABLE); //??DMA??
  41.         
  42. }
  43. }
  44. void GPIO_Configuration(void)
  45. {
  46. GPIO_InitTypeDef GPIO_InitStructure;

  47. /*GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
  48. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //??USART1???????????GPIO???,???????????
  49. GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  50. GPIO_Init(GPIOA, &GPIO_InitStructure);


  51. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
  52. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  53. GPIO_Init(GPIOA, &GPIO_InitStructure);*/



  54. //PA0/1/2 ??????????
  55. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0| GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3;
  56. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //??????
  57. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;         //??????
  58. GPIO_Init(GPIOA, &GPIO_InitStructure);

  59. //PB0/1 ??????????
  60. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1;
  61. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //??????
  62. GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;         //??????
  63. GPIO_Init(GPIOB, &GPIO_InitStructure);

  64. //PC0/1/2/3/4/5 ??????????
  65. GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5;
  66. GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN; //??????
  67. GPIO_Init(GPIOC, &GPIO_InitStructure);
  68. }




  69. void DMA_Configuration(void)
  70. {
  71. DMA_InitTypeDef DMA_InitStructure;
  72. DMA_DeInit(DMA1_Channel1); //?DMA???1?????????
  73. DMA_InitStructure.DMA_PeripheralBaseAddr = (u32)&ADC1->DR; //DMA??ADC???
  74. DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&AD_Value; //DMA?????
  75. DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC; //????????????
  76. DMA_InitStructure.DMA_BufferSize = N*M; //DMA???DMA?????
  77. DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable; //?????????
  78. DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; //?????????
  79. DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord; //?????16?
  80. DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord; //?????16?
  81. DMA_InitStructure.DMA_Mode = DMA_Mode_Circular; //?????????
  82. DMA_InitStructure.DMA_Priority = DMA_Priority_High; //DMA?? x??????
  83. DMA_InitStructure.DMA_M2M = DMA_M2M_Disable; //DMA??x????????????
  84. DMA_Init(DMA1_Channel1, &DMA_InitStructure); //??DMA_InitStruct?????????DMA???
  85.         
  86.         
  87.         
  88. }
  89. /*******************************************************************************
  90. * 函 数 名         : main
  91. * 函数功能                   : 主函数
  92. * 输    入         : 无
  93. * 输    出         : 无
  94. *******************************************************************************/
  95. int main()
  96. {
  97.         u8 j=0;
  98.         float value[12];
  99.         SysTick_Init(72);
  100.         RCC_Configuration();
  101.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);  //中断优先级分组 分2组
  102.         LED_Init();
  103.         USART1_Init(9600);
  104.         GPIO_Configuration();
  105.         DMA_Configuration();
  106.         ADC1_Configuration();
  107.          
  108.          ADC_DMACmd(ADC1, ENABLE);
  109.   

  110.   ADC_Cmd(ADC1, ENABLE);

  111.      
  112.   ADC_ResetCalibration(ADC1);

  113.   while(ADC_GetResetCalibrationStatus(ADC1));


  114.   ADC_StartCalibration(ADC1);

  115.   while(ADC_GetCalibrationStatus(ADC1));
  116.   

  117.   
  118.         ADC_SoftwareStartConvCmd(ADC1, ENABLE);//开启adc转换
  119.   DMA_Cmd(DMA1_Channel1, ENABLE); //开启DMA通道
  120.         while(1)
  121.         {
  122.                 j++;
  123.                
  124.                
  125.                 if(j%50==0)
  126.                 {
  127.                         
  128. while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);//?????????????????

  129. filter();
  130. for(i=0;i<12;i++)
  131. {
  132. value[i]= GetVolt(After_filter[i]);
  133.          value1[i]=value[i];
  134. printf("value[%d]: %d  %.2fv\n",i,value1[i]*100,value[i]) ;
  135. delay_ms(100);
  136. }
  137.         }
  138.   }
  139. }
  140. float GetVolt(u16 advalue)

  141. {float temp;
  142. temp=advalue * 3.3 / 4096;

  143. return temp;

  144. }




  145. void filter(void)
  146. {
  147. ……………………

  148. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
21. ADC模数转换实验.rar (292.9 KB, 下载次数: 26)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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