你的浏览器版本过低,可能导致网站不能正常访问!为了你能正常使用网站功能,请使用这些浏览器。
举报
mylovemcu 发表于 2019-9-3 18:41 那就是说使用内部时钟和外部时钟的时候 ADC的采样频率是不一样的吧 采样频率不一样会导致采样的精度发 ...
wenyangzeng 发表于 2019-9-3 07:29 HSI一般只有32KHZ而非8MHZ,而且STM32系列供电只有3.3V,ADC采样5V电压已经超过Vref基准了,当测量电压达到3 ...
wenyangzeng 发表于 2019-9-3 07:29 STM32系列供电只有3.3V,ADC采样5V电压已经超过Vref基准了,当测量电压达到3.3V时读数就为0XFFF了,这时测 ...
00-405686 发表于 2019-9-3 09:16 你描述的应该是从外部晶振切换到内部HSI晶振8M,切换晶振还要看你时钟配置是否为72M,另外你ADC采集间隔是 ...
mylovemcu 发表于 2019-9-3 09:44 内部时钟最高到64MHz 检查一下是不是频率导致的采样率发生变化 可通过更改AD的采样分频 调整一下试试 ...
哀歌与世无争 发表于 2019-9-3 10:02 切换到内部HSI后,adc有没有重新初始化
{
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);
}
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);
}
采样频率都有修改过,但目前发现这个ADCCLK对这个精度影响很大,当ADC时钟为4MHZ或以下,精度比较准确,用9M(72/8),,误差很大
LSI是32KHz的 HSI是8MHz的
不好意思,表达式无,外部输入5V,通过分压电阻检测到的是0x740
对,是从72M,切换到内部的8M,采样大中小的几个采样点都测试过,一样的效果,都有偏差,有校准
内部没有倍频,直接用了8M的测试
切换完之后,最初没有初始化,后来加上了,但效果一样。。。。