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

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管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版