你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32F030 重启采样不对

[复制链接]
joseya 提问时间:2014-12-23 19:49 /
本人用STM32F030做一个检测电路..不断电将程序烧进去,采样正确. 但是断电重启AD采样就不对了,一直显示同一个数字,复位后瞬间能正常采样,但之后采样值保持不变,即使电压改变也保持不变..处理器有一个脚设置500Hz的脉宽输出一直是正常的..数值显示我是通过CP2102转USB传到电脑的,1秒上传1次..
请问这是怎么回事??刚接触这类单片机..有很多不懂,请大神指点一下!

捕获.PNG
收藏 评论17 发布时间:2014-12-23 19:49

举报

17个回答
joseya 回答时间:2014-12-24 23:16:46
奔跑小蜗牛 发表于 2014-12-24 12:20
测几百mv输出2965那也不对额。。。AD采样电路发一下,还有AD数据处理程序发一下 ...

我是通过DMA中断来处理采样的


  1. #include "adc.h"
  2. /*该头文件对GPIO、ADC、DMA进行了初始化处理*/

  3. /* Private typedef -----------------------------------------------------------*/
  4. /* Private define ------------------------------------------------------------*/
  5. #define ADC1_DR_Address                0x40012440

  6. #define N 10


  7. __IO uint16_t RegularConvData_Tab[10];
  8. __IO uint16_t adc_IT;
  9. uint16_t num=0;
  10. uint16_t adc_avg;

  11. void DMA_INT_Config(void)
  12. {
  13.         NVIC_InitTypeDef NVIC_InitStructure;
  14.         NVIC_InitStructure.NVIC_IRQChannel = DMA1_Channel1_IRQn;
  15.   NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
  16.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  17.   NVIC_Init(&NVIC_InitStructure);   
  18. }


  19. void ADC1_DMA_Init(void)
  20. {
  21.   ADC_InitTypeDef     ADC_InitStruct;
  22.   DMA_InitTypeDef     DMA_InitStruct;
  23.   GPIO_InitTypeDef    GPIO_InitStruct;
  24.           /* ADC1 DeInit */  
  25.   ADC_DeInit(ADC1);                //将外设ADC1的全部寄存器重设为缺省值

  26.         /* Enable  GPIOA clock */
  27.         RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE);
  28.   /* ADC1 Periph clock enable */
  29.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1, ENABLE);
  30.   /* DMA1 clock enable */
  31.   RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1 , ENABLE);

  32.   /* Configure PA.01  as analog input */
  33.   GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  34.   GPIO_InitStruct.GPIO_Mode = GPIO_Mode_AN;
  35.         GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL ;                //无上拉下拉
  36.   GPIO_Init(GPIOA, &GPIO_InitStruct);



  37.   /* DMA1 Channel1 Config */  //配置DMA
  38.   DMA_DeInit(DMA1_Channel1);                //DMA通道Channel1重设为缺省值
  39.   DMA_InitStruct.DMA_PeripheralBaseAddr = (uint32_t)ADC1_DR_Address;               
  40.   DMA_InitStruct.DMA_MemoryBaseAddr = (uint32_t)&RegularConvData_Tab;
  41.   DMA_InitStruct.DMA_DIR = DMA_DIR_PeripheralSRC;
  42.   DMA_InitStruct.DMA_BufferSize =10;                        //
  43.   DMA_InitStruct.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
  44.   DMA_InitStruct.DMA_MemoryInc = DMA_MemoryInc_Enable;
  45.   DMA_InitStruct.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
  46.   DMA_InitStruct.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
  47.   DMA_InitStruct.DMA_Mode = DMA_Mode_Circular;                  //循环模式开启,Buffer写满后 自动回到初始地址开始写
  48.   DMA_InitStruct.DMA_Priority = DMA_Priority_High;
  49.   DMA_InitStruct.DMA_M2M = DMA_M2M_Disable;
  50.   DMA_Init(DMA1_Channel1, &DMA_InitStruct);               
  51.   
  52.         /* DMA1 Channel1 enable */
  53.   DMA_Cmd(DMA1_Channel1, ENABLE);       
  54.         DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);        
  55.   
  56. //   /* ADC DMA request in circular mode */
  57.   ADC_DMARequestModeConfig(ADC1, ADC_DMAMode_Circular);
  58.   
  59.   /* Enable ADC_DMA */
  60.   ADC_DMACmd(ADC1, ENABLE);  
  61.   
  62.   /* Initialize ADC structure */
  63.   ADC_StructInit(&ADC_InitStruct);                //初始ADC配置
  64.   
  65.   /* Configure the ADC1 in continous mode withe a resolutuion equal to 12 bits  */
  66.   ADC_InitStruct.ADC_Resolution = ADC_Resolution_12b;
  67.   ADC_InitStruct.ADC_ContinuousConvMode = ENABLE;
  68.   ADC_InitStruct.ADC_ExternalTrigConvEdge = ADC_ExternalTrigConvEdge_None;
  69.   ADC_InitStruct.ADC_DataAlign = ADC_DataAlign_Right;
  70.   ADC_Init(ADC1, &ADC_InitStruct);

  71.   /* Convert the ADC1 Vref  with 55.5 Cycles as sampling time */
  72.   ADC_ChannelConfig(ADC1, ADC_Channel_0  , ADC_SampleTime_55_5Cycles);

  73.   
  74.   /* ADC Calibration */
  75.   ADC_GetCalibrationFactor(ADC1);
  76.    ADC_DMACmd(ADC1, ENABLE);
  77.   /* Enable ADC1 */
  78.   ADC_Cmd(ADC1, ENABLE);     
  79.   
  80.   /* Wait the ADCEN falg */
  81.   while(!ADC_GetFlagStatus(ADC1, ADC_FLAG_ADEN));                 //等待完成校准
  82.   
  83.   /* ADC1 regular Software Start Conv */
  84.   ADC_StartOfConversion(ADC1);                //软件触发ADC转换
  85. }



  86. void filter(void)                        //50次DMA1中断处理一次
  87. {
  88.         static uint32_t  sum = 0;
  89.         static uint8_t count;
  90.         num++;
  91.         if(num>=50)
  92.         {       
  93.                 num=0;
  94.                 for (count=0;count<N;count++)
  95.     {
  96.                         sum += RegularConvData_Tab[count];
  97.     }
  98.                         adc_IT=sum/N;
  99.                         sum=0;
  100.         }  
  101. }

  102. void Get_adcavg(void)                        //5ms更新并判断一次数据
  103. {
  104.         adc_avg=adc_IT*3.3*1000/4096;
  105. }


  106. //以下是DMA中断处理

  107. void DMA1_Channel1_IRQHandler(void)
  108. {
  109.         if(DMA_GetITStatus(DMA1_IT_TC1) != RESET)
  110.         {
  111.                 DMA_ClearITPendingBit(DMA1_IT_TC1);
  112.                 DMA_Cmd(DMA1_Channel1, DISABLE);
  113.                 filter();
  114.                 DMA_Cmd(DMA1_Channel1, ENABLE);               
  115.         }
  116. }



  117. 以下是主函数


  118. #include "stm32f0xx.h"
  119. #include "adc.h"
  120. #include "systick.h"
  121. #include "led.h"
  122. #include "uart.h"

  123. extern  uint16_t  adc_avg;     

  124. int main(void)
  125. {   
  126.           int adc;
  127.                 USART_Configuration();
  128.                 Systick_Init();
  129.           ADC1_DMA_Init();               
  130.                 LED_Init();       
  131.                 DMA_INT_Config();
  132.           while(1)
  133.                 {
  134.                         Delay(1000);
  135.                         Get_adcavg();
  136.                         adc=adc_avg;
  137.                         printf("voltage= %d V\r\n",adc);
  138.                 }       
  139. }

复制代码
晓枫VS枯叶 回答时间:2014-12-25 09:10:25
  1. DMA_Cmd(DMA1_Channel1, DISABLE);
  2.                 filter();
  3.                 DMA_Cmd(DMA1_Channel1, ENABLE);   
复制代码
建议先把DMA中断这几条注释掉,看看RegularConvData_Tab这个数组里的数据对不对!





joseya 回答时间:2014-12-23 21:28:37
joseya 发表于 2014-12-23 21:11
是的,所以不知道问题出在哪里..现在有时复位能正确采样,有时不行..

请问,如果处理器供电电压手动增大直到电压达到3.3V,会不会对处理器的工作有影响?
晓枫VS枯叶 回答时间:2014-12-23 20:23:56
你采集的电压大概多少V?
joseya 回答时间:2014-12-23 20:33:39
晓枫VS枯叶 发表于 2014-12-23 20:23
你采集的电压大概多少V?

几百毫伏
晓枫VS枯叶 回答时间:2014-12-23 20:37:11
几百mv的话,你这数据就完全不对了!
joseya 回答时间:2014-12-23 21:11:24
晓枫VS枯叶 发表于 2014-12-23 20:37
几百mv的话,你这数据就完全不对了!

是的,所以不知道问题出在哪里..现在有时复位能正确采样,有时不行..
wamcncn 回答时间:2014-12-23 22:16:52
重器后程序开始运行的地址对吗
奔跑小蜗牛 回答时间:2014-12-24 12:20:08
本帖最后由 奔跑小蜗牛 于 2014-12-24 16:51 编辑

测几百mv输出2965那也不对额。。。AD采样电路发一下,还有AD数据处理程序发一下
小贾-370388 回答时间:2014-12-24 12:58:46
有可能是你定义的变量没有初始化
joseya 回答时间:2014-12-24 23:18:34
小贾-370388 发表于 2014-12-24 12:58
有可能是你定义的变量没有初始化

有时可以正常有时不能正常,应该不是变量的问题吧!
子曰小玖 回答时间:2014-12-25 08:12:12
跟踪一下   
奔跑小蜗牛 回答时间:2014-12-25 08:55:48
看程序好像没问题,你电路是不是AD采样有接触不良?
小贾-370388 回答时间:2014-12-26 13:37:08
joseya 发表于 2014-12-24 23:18
有时可以正常有时不能正常,应该不是变量的问题吧!

变量你不赋值的话,初始化的时候变量的值是不确定的,你看一下你用到的变量时不时有这个问题
12下一页

所属标签

相似问题

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版