完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
用的新唐m483芯片,想对700k左右的信号通过pwm触发进行eadc采样通过pdma输出,后续用来做带通滤波和傅里叶变化。
求大佬指点,adc的采样率部分如何设置才能满足700k信号采集的需要,看到官方文档中提到最高采样率可以达到5.14M,。 #include #include "NuMicro.h" #include "arm_math.h" #define PLL_CLOCK 192000000 #define ADC_SAMPLE_RATE 6 #define SAMPLE_NUM 512 #define NUM_ADC_CHANNELS 1 #define PDMA_CH 2 int16_t adcValues[SAMPLE_NUM] = {0}; float32_t fft_out[SAMPLE_NUM]; uint32_t ifft_flag = 0; uint32_t i; float32_t DSPCaltime; uint32_t g_u32SampleModuleNum = 0; float32_t output[SAMPLE_NUM]; float32_t temp_output[SAMPLE_NUM]; float32_t amplitudes[SAMPLE_NUM/2]; float32_t frequencies[SAMPLE_NUM/2]; volatile uint32_t AdcInput; float32_t AdcInput_float; uint32_t status; float32_t *inputF32, *outputF32; float32_t firStateF32[SAMPLE_NUM+5]; arm_rfft_fast_instance_f32 S; arm_fir_instance_f32 iir_inst; volatile uint32_t g_u32AdcIntFlag; volatile uint32_t g_u32AdcIntFlag, g_u32COVNUMFlag = 0; volatile uint32_t g_u32IsTestOver = 0; void SYS_Init(void) { PF->MODE = ~(GPIO_MODE_MODE2_Msk | GPIO_MODE_MODE3_Msk); CLK_EnableXtalRC(CLK_PWRCTL_HXTEN_Msk); CLK_WaitClockReady(CLK_STATUS_HXTSTB_Msk); CLK_SetCoreClock(PLL_CLOCK); CLK->PCLKDIV = (CLK_PCLKDIV_APB0DIV_DIV2 | CLK_PCLKDIV_APB1DIV_DIV2); CLK_EnableModuleClock(UART0_MODULE); CLK_SetModuleClock(UART0_MODULE, CLK_CLKSEL1_UART0SEL_HXT, CLK_CLKDIV0_UART0(1)); CLK_EnableModuleClock(EPWM0_MODULE); CLK_SetModuleClock(EPWM0_MODULE, CLK_CLKSEL2_EPWM0SEL_PCLK0, 0); CLK_EnableModuleClock(EADC_MODULE); CLK_SetModuleClock(EADC_MODULE, 0, CLK_CLKDIV0_EADC(8)); CLK_EnableModuleClock(PDMA_MODULE); SYS->GPB_MFPH = ~(SYS_GPB_MFPH_PB12MFP_Msk | SYS_GPB_MFPH_PB13MFP_Msk); SYS->GPB_MFPH |= (SYS_GPB_MFPH_PB12MFP_UART0_RXD | SYS_GPB_MFPH_PB13MFP_UART0_TXD); PB->MODE = ~(GPIO_MODE_MODE6_Msk | GPIO_MODE_MODE7_Msk); SYS->GPB_MFPL = ~(SYS_GPB_MFPL_PB6MFP_Msk | SYS_GPB_MFPL_PB7MFP_Msk); SYS->GPB_MFPL |= (SYS_GPB_MFPL_PB6MFP_EADC0_CH6 | SYS_GPB_MFPL_PB7MFP_EADC0_CH7); GPIO_DISABLE_DIGITAL_PATH(PB, BIT7|BIT6); SYS->GPB_MFPL = (SYS->GPB_MFPL (~SYS_GPB_MFPL_PB5MFP_Msk)); SYS->GPB_MFPL |= SYS_GPB_MFPL_PB5MFP_EPWM0_CH0; } void UART0_Init() { UART_Open(UART0, 115200); } void EPWM0_Init() { uint16_t TimeBASE=1000; EPWM_ConfigOutputChannel(EPWM0, 0, TimeBASE, 50); EPWM_Start(EPWM0, EPWM_CH_0_MASK); EPWM_EnableADCTrigger(EPWM0,0,EPWM_TRG_ADC_EVEN_COMPARE_DOWN); EPWM_SET_OUTPUT_LEVEL(EPWM0, BIT0, EPWM_OUTPUT_HIGH, EPWM_OUTPUT_LOW, EPWM_OUTPUT_NOTHING, EPWM_OUTPUT_NOTHING); EPWM_EnableOutput(EPWM0, BIT0); } void PDMA_Init() { PDMA_Open(PDMA,BIT2); PDMA_SetTransferCnt(PDMA,PDMA_CH, PDMA_WIDTH_16, SAMPLE_NUM); PDMA_SetTransferAddr(PDMA,PDMA_CH, (uint32_t) EADC->DAT[g_u32SampleModuleNum], PDMA_SAR_FIX, (uint32_t)adcValues, PDMA_DAR_INC); PDMA_SetTransferMode(PDMA,PDMA_CH, PDMA_EADC0_RX, FALSE, 0); PDMA_SetBurstType(PDMA,PDMA_CH, PDMA_REQ_SINGLE, PDMA_BURST_4); PDMA_EnableInt(PDMA,PDMA_CH, PDMA_INT_TRANS_DONE); NVIC_EnableIRQ(PDMA_IRQn); } void ReloadPDMA() { PDMA_SetTransferCnt(PDMA,PDMA_CH, PDMA_WIDTH_16, SAMPLE_NUM); PDMA_SetTransferMode(PDMA,PDMA_CH, PDMA_EADC0_RX, FALSE, 0); } void PDMA_IRQHandler(void) { status = PDMA_GET_INT_STATUS(PDMA); if(status PDMA_INTSTS_ABTIF_Msk) { if(PDMA_GET_ABORT_STS(PDMA) PDMA_ABTSTS_ABTIF2_Msk) g_u32IsTestOver = 2; PDMA_CLR_ABORT_FLAG(PDMA,PDMA_ABTSTS_ABTIF2_Msk); } else if(status PDMA_INTSTS_TDIF_Msk) { if(PDMA_GET_TD_STS(PDMA) PDMA_TDSTS_TDIF2_Msk) g_u32IsTestOver = 1; PDMA_CLR_TD_FLAG(PDMA,PDMA_TDSTS_TDIF2_Msk); } else printf("unknown interrupt !!n"); } void GetAdcData() { EADC_Open(EADC, EADC_CTL_DIFFEN_SINGLE_END); EADC_ConfigSampleModule(EADC, g_u32SampleModuleNum, EADC_EPWM0TG0_TRIGGER,2); if (SYS->CSERVER SYS_CSERVER_VERSION_Msk) /* M480LD */ EADC_ENABLE_SAMPLE_MODULE_PDMA(EADC, 1< |
|
相关推荐
2个回答
|
|
一般ADC转换速率> 2x信号频率就行
|
|
|
|
要满足700k信号采集的需要,可以按照以下步骤进行设置:
1. 设置ADC的时钟源为PLL,并将PLL配置为所需的采样率,计算公式如下: PLL_CLOCK / (ADC_SAMPLE_RATE + 1) = ADC 时钟频率 这里的 ADC_SAMPLE_RATE 表示 ADC 的抽样保持时间,可以根据需要进行调整。 2. 配置ADC为PWM触发模式,使用PWM作为ADC的触发信号。配置 PWM 定时器和 PWM 通道,使其产生适当的周期和占空比。根据所需的采样频率和分辨率,设置 PWM 定时器的周期和占空比。 3. 配置 PDMA,以便将 ADC 的采样结果传输到指定的缓冲区。 4. 配置带通滤波器和傅里叶变换以处理采样数据。 下面是示例代码: ```c #include #include "NuMicro.h" #include "arm_math.h" #define PLL_CLOCK 192000000 #define ADC_SAMPLE_RATE 6 #define SAMPLE_NUM 512 #define NUM_ADC_CHANNELS 1 #define PDMA_CH 2 int16_t adcValues[SAMPLE_NUM] = {0}; float32_t fft_out[SAMPLE_NUM]; void SYS_Init(void) { // 设置系统时钟为PLL CLK_EnableXtalRC(CLK_PWRCTL_HIRCEN_Msk); CLK_WaitClockReady(CLK_STATUS_HIRCSTB_Msk); CLK_SetCoreClock(PLL_CLOCK); CLK_EnableModuleClock(ADC_MODULE); CLK_EnableModuleClock(PDMA0_MODULE); CLK_EnableModuleClock(PWM0_MODULE); } void ADC_Init(void) { // 配置采样率和时间窗口 ADC_Open(ADC, ADC_INPUT_MODE_SINGLE, ADC_OPERATION_MODE_SINGLE, ADC_CH0_NEG_SRC, ADC_SAMPLE_RATE); ADC_SetExtendSamplingTime(ADC, 0, 71); // 配置ADC通道 ADC_SetChannelMask(ADC, ADC_CH_Msk); ADC_ConfigSars(ADC, ADC_SAR_ADCMOD_Msk, ADC_SAR_ADCRES_Msk); // 配置 PDMA PDMA_Open(PDMA0, BIT0); PDMA_SetTransferCnt(PDMA0, PDMA_CH, PDMA_WIDTH_16, SAMPLE_NUM); PDMA_SetTransferAddr(PDMA0, PDMA_CH, (uint32_t)&ADC->RESULT[0], PDMA_SAR_FIX, (uint32_t)&adcValues[0], PDMA_DAR_INC); PDMA_EnableInt(PDMA0, PDMA_CH, PDMA_INT_TRANS_DONE); NVIC_EnableIRQ(PDMA0_IRQn); PDMA_SetTransferMode(PDMA0, PDMA_CH, PDMA_ADC_RX, FALSE, 0); // 启动 ADC 和 PDMA ADC_START_CONV(ADC); PDMA_CH_ENABLE(PDMA0, PDMA_CH); } void PWM_Init(void) { // 配置 PWM PWM_Open(PWM0, 0, PWM_PERIOD, PWM_CMR_CTB_Msk, TRUE); PWM_ConfigOutputChannel(PWM0, 0, PWM_CNR_PWM_PERIOD, 0); PWM_EnableOutput(PWM0, 0); // 配置 ADC 为 PWM 触发模式 ADC_EnableHWTrigger(ADC, ADC_TRIGGER_BY_PWM); // 启动 PWM PWM_Start(PWM0, PWM_CH_0_MASK); } void PDMA0_IRQHandler(void) { if(PDMA_GET_TD_STS(PDMA0) & (1 << PDMA_CH)) { // 数据采集完成,进行处理 arm_rfft_fast_instance_f32 S; arm_rfft_fast_init_f32(&S, SAMPLE_NUM); arm_rfft_fast_f32(&S, (float32_t*)&adcValues[0], &fft_out[0], 0); // 进行带通滤波等处理 // ... PDMA_CLR_TD_FLAG(PDMA0, (1 << PDMA_CH)); } } int32_t main(void) { SYS_Init(); ADC_Init(); PWM_Init(); while(1) { // 等待采样数据处理完成 // ... } } ``` 需要根据具体的需求和硬件条件进行适当的调整。注意,示例代码中的宏定义和函数调用是根据新唐 m483 芯片的库函数进行的,如果使用其他芯片可能需要做相应修改。另外,示例代码中的带通滤波和傅里叶变换的处理部分还需要进一步完善。 |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
为什么用FatFS在SD卡创建文件,在单片机上读写正常,用读卡器插到电脑上就什么都没有
720 浏览 0 评论
932 浏览 2 评论
《DNK210使用指南 -CanMV版 V1.0》第九章 打印输出实验
442 浏览 0 评论
stm32f407+ksz8863rlli概率性ping不通
1159 浏览 1 评论
嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-常见网络服务搭建之NFS服务搭建
554 浏览 0 评论
【youyeetoo X1 windows 开发板体验】少儿AI智能STEAM积木平台
11378 浏览 31 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-10-2 15:18 , Processed in 0.837738 second(s), Total 76, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号