完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
本帖最后由 为了让生活美好 于 2019-6-24 09:13 编辑
要用STM32F4芯片内部ADC采集一路频率为50hz的正弦信号,要求的采样点是一个周期20点,即采样频率为1Khz。我使用的采样方式是ADC+DMA+tiM,用定时器生成一个PWM然后触发ADC采样,DMA配置的是每传输20次生成一个完成中断。 现在按照这种方式可以实现采样,但是采样出来的数据不是按照我设置的频率进行,我设置的 频率是1khz但是采样出来的数据并没有1ms采集一次,我把数据用串口打印出来然后用EXCEL绘图发现一个周波里面不止20个点,不知道为什么会产生这问题。后面我在DMA完成中断中加一条代码让一个引脚不断翻转然后我用示波器测量他的频率发现频率为53hz,这个频率说明我是20ms完成一次传输哇,真是搞不懂为什么合成的波形就是不对。 相关代码: //ADC配置 void Adc_Config(void) { GPIO_InitTypeDef GPIO_InitStructure; ADC_InitTypeDef ADC_InitStructure; ADC_CommonInitTypeDef ADC_CommonInitStructure; RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOF, ENABLE); RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC3, ENABLE); /* PF4->IN14, PF5->IN15 */ GPIO_InitStructure.GPIO_Pin=GPIO_Pin_4; GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AN; GPIO_InitStructure.GPIO_PuPd=GPIO_PuPd_NOPULL; GPIO_InitStructure.GPIO_OType=GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz; GPIO_Init(GPIOF, &GPIO_InitStructure); ADC_CommonInitStructure.ADC_Mode=ADC_Mode_Independent; ADC_CommonInitStructure.ADC_Prescaler=ADC_Prescaler_Div6; ADC_CommonInitStructure.ADC_DMAAccessMode=ADC_DMAAccessMode_Disabled; ADC_CommonInitStructure.ADC_TwoSamplingDelay=ADC_TwoSamplingDelay_5Cycles; ADC_CommonInit(&ADC_CommonInitStructure); ADC_InitStructure.ADC_Resolution=ADC_Resolution_12b; ADC_InitStructure.ADC_ScanConvMode=DISABLE; ADC_InitStructure.ADC_DataAlign=ADC_DataAlign_Right; ADC_InitStructure.ADC_ContinuousConvMode=DISABLE; ADC_InitStructure.ADC_NbrOfConversion=1; ADC_InitStructure.ADC_ExternalTrigConv=ADC_ExternalTrigConv_T8_CC1; ADC_InitStructure.ADC_ExternalTrigConvEdge=ADC_ExternalTrigConvEdge_Rising; ADC_Init(ADC3, &ADC_InitStructure); /* 规则通道选择 */ ADC_RegularChannelConfig(ADC3, ADC_Channel_14, 1, ADC_SampleTime_480Cycles); #if USE_ADC_DMA ADC_DMARequestAfterLastTransferCmd(ADC3, ENABLE); ADC_DMA_Config((uint32_t*)Test_Var.Databuf[0], (uint32_t*)Test_Var.Databuf[1], 20); ADC_DMACmd(ADC3, ENABLE); #else ADC_EOCOnEachRegularChannelCmd(ADC3, ENABLE); ADC_ITConfig(ADC3, ADC_IT_EOC, ENABLE); #endif ADC_NVIC_Config(); ADC_Cmd(ADC3, DISABLE); Adc_SampleFre_Config(); } //采样频率配置 void Adc_SampleFre_Config(void) { TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStructure; TIM_OCInitTypeDef TIM_OCInitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM8, ENABLE); TIM_TimeBaseInitStructure.TIM_Period=999; TIM_TimeBaseInitStructure.TIM_Prescaler=41; /* 1000k */ TIM_TimeBaseInitStructure.TIM_CounterMode=TIM_CounterMode_Up; TIM_TimeBaseInitStructure.TIM_ClockDivision=TIM_CKD_DIV1; TIM_TimeBaseInitStructure.TIM_RepetitionCounter=0; TIM_TimeBaseInit(TIM8, &TIM_TimeBaseInitStructure); //TIM_SelectOutputTrigger(TIM8, TIM_TRGOSource_Update); TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_Pulse=500; TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low; TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable; TIM_OC1Init(TIM8, &TIM_OCInitStructure); TIM_OC1PreloadConfig(TIM8, ENABLE); TIM_CtrlPWMOutputs(TIM8, ENABLE); /* for TIM1/TIM8 */ // TIM_ARRPreloadConfig(TIM8, ENABLE); TIM_Cmd(TIM8, DISABLE); } //开始采样 void ADC_Start(void) { #if USE_ADC_DMA // ADC_DMA_Config(); DMA2->LIFCR = ((uint32_t)0x0000007D); while(DMA_GetCmdStatus(DMA2_Stream0)!= DISABLE); DMA2_Stream0->CR |= (uint32_t)DMA_SxCR_EN; /* 使能DMA2_Stream0 */ #endif ADC3->CR2 |= (uint32_t)ADC_CR2_ADON; /* 使能ADC3 */ TIM8->CR1 |= TIM_CR1_CEN; /* 使能定时器8 */ }
|
|
相关推荐
2个回答
|
|
定时器分频系数哪里我写错了,应该是83。这个是我后面换定时器导致的
|
|
|
|
问题找到了,问题就是这个定时器频率我没搞清楚导致采样率是设置值的两倍。定时器的频率要根据总线分频系数确定
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
1492 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
1427 浏览 3 评论
3261 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1560 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1995 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-5 10:40 , Processed in 0.929676 second(s), Total 75, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号