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

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

[复制链接]
木桩上的跛脚人 提问时间:2019-9-2 18:15 /
阅读主题, 点击返回1楼
收藏 评论21 发布时间:2019-9-2 18:15
21个回答
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
时钟有问题吗?
木桩上的跛脚人 回答时间: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-3 15:56:46
上面分别是ADC的初始化,及内部HSI的初始化部分
木桩上的跛脚人 回答时间:2019-9-3 17:20:02
误导大家了。。。,我重新滤了一遍,72M时ADCCLK 8分频,为9MHZ,当切换到内部时钟时,ADCCLK是2MHZ,,,,,,在ADCCLK为 2MHZ时,是正确的值,,,,在9MHZ的时候,是有误差比较大的值
mylovemcu 回答时间:2019-9-3 18:41:30
木桩上的跛脚人 发表于 2019-9-3 15:14
内部没有倍频,直接用了8M的测试

那就是说使用内部时钟和外部时钟的时候  ADC的采样频率是不一样的吧  采样频率不一样会导致采样的精度发生变化
只要保证在相同频率下测试的重复误差达到要求就可以了
木桩上的跛脚人 回答时间:2019-9-4 16:30:09
mylovemcu 发表于 2019-9-3 18:41
那就是说使用内部时钟和外部时钟的时候  ADC的采样频率是不一样的吧  采样频率不一样会导致采样的精度发 ...

采样频率都有修改过,但目前发现这个ADCCLK对这个精度影响很大,当ADC时钟为4MHZ或以下,精度比较准确,用9M(72/8),,误差很大
generalcircuits 回答时间:2019-9-4 17:18:46
哈,这也挺戏剧性的,最后发现没有问题
关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版