我想设置一个1Khz的采样率来采集数据。要采集1000个点。请问程序怎么写啊。。ADC的采样率貌似的用定时器来完成。然后1000个点我用DMA来拟定。只要1000个点我就近DMA中断取数且分析。程序谁有代码给我看看。。另复上我百度的。不知道能用否。
void stm32ADCDMA(void)
{
ADC_InitTypeDef ADC_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
DMA_InitTypeDef DMA_InitStructure; //定义DMA初始化结构体
adc_GPIO_Init(); //模拟口初始化
ADC_DeInit(ADC1);
RCC_APB2PeriphClockCmd(RCC_APB2Periph_ADC1,ENABLE);
/* ADC1 configuration ------------------------------------------------------*/
ADC_InitStructure.ADC_Mode =
ADC_Mode_Independent; //独立模式
ADC_InitStructure.ADC_ScanConvMode = ENABLE;
//扫描模式
ADC_InitStructure.ADC_ContinuousConvMode =
DISABLE; //单次转换
ADC_InitStructure.ADC_ExternalTrigConv
=ADC_ExternalTrigConv_T2_CC2; //由TIM2的CC2触发
ADC_InitStructure.ADC_DataAlign =
ADC_DataAlign_Right; //数据右对齐
ADC_InitStructure.ADC_NbrOfChannel =7;
//采样一个通道
ADC_Init(ADC1, &ADC_InitStructure);
ADC_RegularChannelConfig(ADC1, ADC_Channel_0,
1,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_1,
2,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_2,
3,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_3,
4,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_4,
5,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_5,
6,ADC_SampleTime_13Cycles5);
ADC_RegularChannelConfig(ADC1, ADC_Channel_6,
7,ADC_SampleTime_13Cycles5);
ADC_DMACmd(ADC1, ENABLE);
ADC_Cmd(ADC1, ENABLE);
//启动ADC1
ADC_ResetCalibration(ADC1);
//重置ADC1的校准寄存器
while (ADC_GetResetCalibrationStatus(ADC1));
//获取ADC重置校准寄存器的状态
ADC_StartCalibration(ADC1);
//开始ADC1的校准程序
while (ADC_GetCalibrationStatus(ADC1));
//等待ADC1校准结束
ADC_ITConfig(ADC1,ADC_IT_EOC,ENABLE); //使能ADC中断
ADC_ExternalTrigConvCmd(ADC1, ENABLE);//使能ADC经外部触发启动转换功能
NVIC_InitStructure.NVIC_IRQChannel =
ADC1_2_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;//先占优先级0
NVIC_InitStructure.NVIC_IRQChannelSubPriority
= 0; //从优先级
NVIC_InitStructure.NVIC_IRQChannelCmd =
ENABLE;
NVIC_Init(&NVIC_InitStructure);
/*DMA相关设置*/
RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);//初始化DMA时钟
DMA_DeInit(DMA1_Channel1);
DMA_InitStructure.DMA_PeripheralBaseAddr=ADC1_DR_Address;//外设地址
DMA_InitStructure.DMA_MemoryBaseAddr=(u32)AdcResult;//内存地址
DMA_InitStructure.DMA_DIR=DMA_DIR_PeripheralSRC;//DMA传输方向单向
DMA_InitStructure.DMA_BufferSize=7;//设置DMA在传输时缓冲区的长度 word
DMA_InitStructure.DMA_PeripheralInc=DMA_PeripheralInc_Disable;//设置DMA的外设递增模式,一个外设
DMA_InitStructure.DMA_MemoryInc=DMA_MemoryInc_Enable;//设置DMA的内存递增模式
DMA_InitStructure.DMA_PeripheralDataSize=DMA_PeripheralDataSize_HalfWord;//外设数据字长 16bit
DMA_InitStructure.DMA_MemoryDataSize=DMA_MemoryDataSize_HalfWord;//内存数据字长 16bit
DMA_InitStructure.DMA_Mode=DMA_Mode_Circular;//设置DMA的传输模式:连续不断的循环模式
DMA_InitStructure.DMA_Priority=DMA_Priority_VeryHigh;//DMA优先级别最高 有4种 High/Medium/Low
DMA_InitStructure.DMA_M2M=DMA_M2M_Disable;//设置DMA的2个memory中的变量互相访问禁止
DMA_Init(DMA1_Channel1,&DMA_InitStructure);//按照DMA_InitStructure变量初始化DMA1的通道1
DMA_Cmd(DMA1_Channel1,ENABLE);//允许DMA通道1传输
DMA_ITConfig(DMA1_Channel1,DMA_IT_TC,ENABLE);//使能DMA通道1中断
DMA_ClearFlag(DMA1_FLAG_TC1);//清除Channel1中断
/*配置DMA的中断通道*/
NVIC_InitStructure.NVIC_IRQChannel=DMA1_Channel1_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=0;
NVIC_InitStructure.NVIC_IRQChannelSubPriority=1;
NVIC_InitStructure.NVIC_IRQChannelCmd=ENABLE;
NVIC_Init(&NVIC_InitStructure);
}
然后定时器的配方没找到。。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
---------------------------------
你的1KHz应该是指每个采样点之间是1ms吧?
那就不是前面我说的一个周期1ms
你配置的定时器是1ms溢出采样一次的话,远大于21微秒。
写最大的239.5吧。
你只要两个采样点间隔时间大于准备好的时间,239.5+12.5再乘以1/12就行了。
我也是自己总结的,不一定说的准确。
一周热门 更多>