用的新唐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<
m483adc的采样率部分如何设置才能满足700k信号采集的需要?
关键词: 采样率 ADC 信号采集
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) {
// 等待采样数据处理完成
// ...
}
}
回复
有奖活动 | |
---|---|
【有奖活动】分享技术经验,兑换京东卡 | |
话不多说,快进群! | |
请大声喊出:我要开发板! | |
【有奖活动】EEPW网站征稿正在进行时,欢迎踊跃投稿啦 | |
奖!发布技术笔记,技术评测贴换取您心仪的礼品 | |
打赏了!打赏了!打赏了! |
打赏帖 | |
---|---|
Let'sdo第3期任务合集被打赏50分 | |
与电子爱好者谈读图四被打赏50分 | |
Let‘s do 第三季 [电子测光表] 基础任务和进阶任务成果展示被打赏50分 | |
与电子爱好者谈读图二被打赏50分 | |
【FRDM-MCXN947评测】Core1适配运行FreeRtos被打赏50分 | |
【FRDM-MCXN947评测】双核调试被打赏50分 | |
【CPKCORRA8D1B评测】---移植CoreMark被打赏50分 | |
【CPKCORRA8D1B评测】---打开硬件定时器被打赏50分 | |
【FRDM-MCXA156评测】4、CAN loopback模式测试被打赏50分 | |
【CPKcorRA8D1评测】--搭建初始环境被打赏50分 |