完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
/*******************************************************************************
函数名: SetSampRate 输 入:freq : 采样频率 单位Hz 输 出:void 功 能:设置采样频率 ********************************************************************************/ static void SetSampRate(uint32_t freq) { //配置定时器1第3通道CC3作为ADC的转换触发源 TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure; TIM_OCInitTypeDef TIM_OCInitStructure; uint16_t Period; TIM_Cmd(TIM1, DISABLE); //g_oscilloscope.SampleRate = freq;//将采样频率保存到全部变量中 /* 采样频率计算公式 : period = 72000000 / freq ; 1200 == 60KHz 采样频率 */ Period = 72000000 / freq; RCC_APB2PeriphClockCmd(RCC_APB2Periph_TIM1, ENABLE); TIM_TimeBaseStructInit(&TIM_TimeBaseStructure); TIM_TimeBaseStructure.TIM_Period = Period; TIM_TimeBaseStructure.TIM_Prescaler = 0; TIM_TimeBaseStructure.TIM_ClockDivision = 0x0; TIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; TIM_TimeBaseInit(TIM1, &TIM_TimeBaseStructure); //配置TIM1 OC3 为PWM模式 TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; TIM_OCInitStructure.TIM_Pulse = TIM_TimeBaseStructure.TIM_Period / 2; TIM_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_Low; TIM_OC3Init(TIM1, &TIM_OCInitStructure); TIM_Cmd(TIM1, ENABLE);//使能TIM1 TIM_CtrlPWMOutputs(TIM1, ENABLE);//TIM1 main Output Enable } static void StartADC(void)//ADC开始采样 { DMA_DeInit(DMA1_Channel1);//复位DMA1寄存器到缺省状态 DMA_InitStructure.DMA_PeripheralBaseAddr = ADC1_DR_Address;//选择ADC1的数据寄存器作为源 DMA_InitStructure.DMA_MemoryBaseAddr = (uint32_t)&g_oscilloscope.Ch1Buf;//目标地址 DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralSRC;//设置DMA传输方向,外设(ADC)作为源 DMA_InitStructure.DMA_BufferSize = SAMPLE_COUNT;//设置缓冲区大小 DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//外设地址不自增 DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable;//存储器地址需要自增 DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_HalfWord;//选择外设传输单位:16bit DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_HalfWord;//选择内存传输单位:16bit DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//无需循环模式 DMA_InitStructure.DMA_Priority = DMA_Priority_High;//选择DMA优先级 DMA_InitStructure.DMA_M2M = DMA_M2M_Disable;//DMA传输类型,不是内存到内存 DMA_Init(DMA1_Channel1, &DMA_InitStructure); DMA_Cmd(DMA1_Channel1, ENABLE); DMA_Cmd(DMA2_Channel5, ENABLE); TIM_Cmd(TIM1, ENABLE);} static void StopADC(void)//ADC停止采样 { TIM_Cmd(TIM1, ENABLE);。。。。。 } 有思路了吗? //配置定时器1第3通道CC3作为ADC的转换触发源,转换的数据直接从ADC数据寄存器通过DMA传输到 (uint32_t)&g_oscilloscope.Ch1Buf;//目标地址 !!! |
|
|
|
非常感谢,最近因为AD采样的弄得脑袋一团糟糕~~
原理:根据采样频率设定TIM 的时间,TIM从0开始计数,当计数器的计数值与输出比较寄存器中的值相等时,就输出高脉冲( PWM1 模式中,占空比保持1/2, ),触发AD的转换; 是这样理解吗? 还有一个问题:DMA参数中,buffersize的大小设置,是不是需要传输多个个数据,就设置多大啊的buffersize 啊? 如果一直采样的话,这个缓冲区的大小不可能无限大吧? (RAM有限) |
|
|
|
|
|
楼主现在做好了吗?我也困在这里了。我用定时器,思路是定时时间到后出发中断,AD采样,DMA存储。但是不知道DMA2_IRQHandler,TIM2_IRQHandler怎么写,求指导
|
|
|
|
哈哈,看官方例程呗,肯定有
|
|
|
|
定时器TIM1 CC1 发生中断,没有问题;ADC1也没有问题,就是让TIM1 触发ADC1就是没反应,真是奇了个怪了。
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
2183 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2011 浏览 3 评论
4612 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2154 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
2687 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-25 02:45 , Processed in 0.734755 second(s), Total 83, Slave 67 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号