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

STM32 ADC采用HSI时钟的问题,不准

[复制链接]
木桩上的跛脚人 提问时间:2019-9-2 18:15 /
   各位大神,我这出现个问题,正常STM32103的片子,72M时钟的时候,ADC采样正常,当我准备降低部分功耗后,将时钟切换到HSI 8M时钟时,ADC采样的值,比72M时的值要高,如:采集电压,5V时。。。。。。。,72M时钟,,,采样ADC值为0x740;当前换到HSI 8M时,采样的ADC值为:0x790;求大神指点!

收藏 评论21 发布时间:2019-9-2 18:15

举报

21个回答
木桩上的跛脚人 回答时间:2019-9-3 15:55:33
void ADCInit(void)
{
        ADC_InitTypeDef ADC_InitStructure;
        DMA_InitTypeDef DMA_InitStructure;

        //DMA channel1 configuration
        ADC_Cmd(ADC1, DISABLE);
        DMA_Cmd(DMA1_Channel1, DISABLE);
       
        DMA_InitStructure.DMA_PeripheralBaseAddr = DR_ADDRESS;
        DMA_InitStructure.DMA_MemoryBaseAddr = (u32)&g_u32PowerADCValue;
        DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;
        DMA_InitStructure.DMA_BufferSize = 3;

        DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;
        DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable; /* É趨ÄÚ´æµØÖ·µÝ¼Ó ÿ´ÎDMA¶¼Êǽ«ÍâÉè¼Ä´æÆ÷ÖеÄÖµ´«µ½Á½¸öÄÚ´æ¿Õ¼äÖÐ */
        DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;
        DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;
        DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;
        DMA_InitStructure.DMA_Priority = DMA_Priority_High;
        DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;
        DMA_DeInit(DMA1_Channel1);
        DMA_Init(DMA1_Channel1, &DMA_InitStructure);

        // ADC1 configuration
        ADC_InitStructure.ADC_Mode = ADC_Mode_Independent;
        ADC_InitStructure.ADC_ScanConvMode = ENABLE;
        ADC_InitStructure.ADC_ContinuousConvMode = ENABLE;
        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConv_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;
        ADC_InitStructure.ADC_NbrOfChannel = 3;
        ADC_Init(ADC1, &ADC_InitStructure);

        // ADC1 regular channel1 PA1 configuration  
        ADC_RegularChannelConfig(ADC1, ADC_Channel_0, 1, ADC_SampleTime_1Cycles5);//
       
        ADC_RegularChannelConfig(ADC1, ADC_Channel_1, 2, ADC_SampleTime_1Cycles5); //
        //
        ADC_RegularChannelConfig(ADC1, ADC_Channel_16, 3, ADC_SampleTime_1Cycles5 );  //ADC1,ADC??3,?????,?????239.5??     


        ADC_TempSensorVrefintCmd(ENABLE);
        // Enable ADC1 DMA
        ADC_DMACmd(ADC1, ENABLE);

        // Enable ADC1
        ADC_Cmd(ADC1, ENABLE);

        // Enable ADC1 reset calibaration register
        ADC_ResetCalibration(ADC1);
       
        // Check the end of ADC1 reset calibration register
        while(ADC_GetResetCalibrationStatus(ADC1));


        // Start ADC1 calibaration
        ADC_StartCalibration(ADC1);
        // Check the end of ADC1 calibration
        while(ADC_GetCalibrationStatus(ADC1));

        // Start ADC1 Software Conversion  
        ADC_SoftwareStartConvCmd(ADC1, ENABLE);
       
        // Enable DMA channel1
        DMA_Cmd(DMA1_Channel1, ENABLE);

}
木桩上的跛脚人 回答时间:2019-9-3 15:56:12

RCC_DeInit();
  
  RCC_HSICmd(ENABLE);

  while(RCC_GetFlagStatus(RCC_FLAG_HSIRDY) == RESET)
  {

  }  
  
   RCC_HCLKConfig(RCC_SYSCLK_Div1); //AHBʱÖÓΪϵͳʱÖÓSYSCLK
  
   RCC_PCLK2Config(RCC_HCLK_Div2);  //APB1ʱÖÓΪHCLK/2£¬ÆäÖÐHCLKΪAHBʱÖÓ
  
   RCC_PCLK1Config(RCC_HCLK_Div1);  //APB2ʱÖÓΪHCLK
  
       
   //ÉèÖà PLL ʱÖÓÔ´¼°±¶ÆµÏµÊý
  
   RCC_PLLConfig(RCC_PLLSource_HSI_Div2, RCC_PLLMul_2);
  
   //ʹÄÜ»òÕßʧÄÜ PLL,Õâ¸ö²ÎÊý¿ÉÒÔÈ¡£ºENABLE»òÕßDISABLE
  
   RCC_PLLCmd(ENABLE);//Èç¹ûPLL±»ÓÃÓÚϵͳʱÖÓ,ÄÇôËü²»Äܱ»Ê§ÄÜ
  
   //µÈ´ýÖ¸¶¨µÄ RCC ±ê־λÉèÖóɹ¦ µÈ´ýPLL³õʼ»¯³É¹¦
  
   while(RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET)
   {
  
   }
   //ÉèÖÃϵͳʱÖÓ£¨SYSCLK£© ÉèÖÃPLLΪϵͳʱÖÓÔ´  
   RCC_SYSCLKConfig(RCC_SYSCLKSource_PLLCLK);
   //µÈ´ýPLL³É¹¦ÓÃ×÷ÓÚϵͳʱÖÓµÄʱÖÓÔ´
     
   // 0x00£ºHSI ×÷ΪϵͳʱÖÓ
  
   // 0x04£ºHSE×÷ΪϵͳʱÖÓ
  
   // 0x08£ºPLL×÷ΪϵͳʱÖÓ
  
   while(RCC_GetSYSCLKSource() != 0x08)
   {
  
   }
   
//   RCC_ADCCLKConfig(RCC_PCLK2_Div2);
}
木桩上的跛脚人 回答时间:2019-9-4 16:30:09
mylovemcu 发表于 2019-9-3 18:41
那就是说使用内部时钟和外部时钟的时候  ADC的采样频率是不一样的吧  采样频率不一样会导致采样的精度发 ...

采样频率都有修改过,但目前发现这个ADCCLK对这个精度影响很大,当ADC时钟为4MHZ或以下,精度比较准确,用9M(72/8),,误差很大
木桩上的跛脚人 回答时间:2019-9-2 18:19:34
输入电压都是5V没变,采样出的值发生了较大的变化。求指点
wenyangzeng 回答时间:2019-9-3 07:29:16
STM32系列供电只有3.3V,ADC采样5V电压已经超过Vref基准了,当测量电压达到3.3V时读数就为0XFFF了,这时测量5V读数只有0X740就有问题了。请检查一下外测对象硬件连接是否合理。
294479435@qq.co 回答时间:2019-9-3 09:16:01
你描述的应该是从外部晶振切换到内部HSI晶振8M,切换晶振还要看你时钟配置是否为72M,另外你ADC采集间隔是多少?另外是否校准?
mylovemcu 回答时间:2019-9-3 09:44:22
内部时钟最高到64MHz  检查一下是不是频率导致的采样率发生变化  可通过更改AD的采样分频  调整一下试试
无11png.png
mylovemcu 回答时间:2019-9-3 09:45:00
wenyangzeng 发表于 2019-9-3 07:29
HSI一般只有32KHZ而非8MHZ,而且STM32系列供电只有3.3V,ADC采样5V电压已经超过Vref基准了,当测量电压达到3 ...

LSI是32KHz的   HSI是8MHz的
哀歌与世无争 回答时间:2019-9-3 10:02:21
切换到内部HSI后,adc有没有重新初始化
木桩上的跛脚人 回答时间:2019-9-3 15:09:11
wenyangzeng 发表于 2019-9-3 07:29
STM32系列供电只有3.3V,ADC采样5V电压已经超过Vref基准了,当测量电压达到3.3V时读数就为0XFFF了,这时测 ...

不好意思,表达式无,外部输入5V,通过分压电阻检测到的是0x740
木桩上的跛脚人 回答时间:2019-9-3 15:13:02
00-405686 发表于 2019-9-3 09:16
你描述的应该是从外部晶振切换到内部HSI晶振8M,切换晶振还要看你时钟配置是否为72M,另外你ADC采集间隔是 ...

对,是从72M,切换到内部的8M,采样大中小的几个采样点都测试过,一样的效果,都有偏差,有校准
木桩上的跛脚人 回答时间:2019-9-3 15:14:39
mylovemcu 发表于 2019-9-3 09:44
内部时钟最高到64MHz  检查一下是不是频率导致的采样率发生变化  可通过更改AD的采样分频  调整一下试试
...

内部没有倍频,直接用了8M的测试
tanic 回答时间:2019-9-3 15:15:35
代码代码,
木桩上的跛脚人 回答时间:2019-9-3 15:16:40
哀歌与世无争 发表于 2019-9-3 10:02
切换到内部HSI后,adc有没有重新初始化

切换完之后,最初没有初始化,后来加上了,但效果一样。。。。
木桩上的跛脚人 回答时间:2019-9-3 15:36:45
时钟有问题吗?
12下一页

所属标签

相似问题

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32Cube扩展软件包
意法半导体边缘AI套件
ST - 理想汽车豪华SUV案例
ST意法半导体智能家居案例
STM32 ARM Cortex 32位微控制器
关注我们
st-img 微信公众号
st-img 手机版