CH585_ADC SCAN快速采集
实现功能:
例如采集5通道ADC数据,BUF配置20,则实现channel0数据放在BUF[0],channel1=BUF[1]...channel0=BUF[5]...
可以实现快速采集数据。
注意:不需要使用中断。
实际使用场景:例如高上报率手柄需要快速ADC采样,可采用该方式
代码(配合蓝牙从机使用):
volatile uint8_t i = 0;
volatile uint8_t PRINT_flag = 0;
#define ADC_PBUFFER_LENGTH 20//(96*15)
__attribute__ ((aligned(4))) uint16_t adc_buffer[ADC_PBUFFER_LENGTH] ;
/* 注意当使用ADC扫描功能时,例程默认打印脚由PA14更改为PB7*/
#define ADC_SCAN_MODE_EXAM 1
#define ADC_SCAN_CH_NUM 5//14
#define ADC_SCAN1_CH_IDX_1 (0)
#define ADC_SCAN1_CH_IDX_2 (4)
#define ADC_SCAN1_CH_IDX_3 (8)
#define ADC_SCAN1_CH_IDX_4 (12)
#define ADC_SCAN1_CH_IDX_5 (16)
#define ADC_SCAN1_CH_IDX_6 (20)
#define ADC_SCAN1_CH_IDX_7 (24)
#define ADC_SCAN1_CH_IDX_8 (28)
#define ADC_SCAN2_CH_IDX_9 (0)
#define ADC_SCAN2_CH_IDX_10 (4)
#define ADC_SCAN2_CH_IDX_11 (8)
#define ADC_SCAN2_CH_IDX_12 (12)
#define ADC_SCAN2_CH_IDX_13 (16)
const uint32_t ADC_PIN[14] = {
0x00000010, // PA4,AIN0
0x00000020, // PA5,AIN1
0x00001000, // PA12,AIN2
0x00002000, // PA13,AIN3
0x00004000, // PA14,AIN4
0x00008000, // PA15,AIN5
0x00000008, // PA3,AIN6
0x00000004, // PA2,AIN7
0x00000002, // PA1,AIN8
0x00000001, // PA0,AIN9
0x00000040, // PA6,AIN10
0x00000080, // PA7,AIN11
0x00000100, // PA8,AIN12
0x00000200 // PA9,AIN13
};
const uint8_t adc_ch_seq[14] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13};
#define printLen 80
volatile uint16_t adcBuff[printLen];
volatile uint8_t adclen;
volatile uint8_t DMA_end = 0;
__HIGH_CODE
void adc_scan_test()
{
uint32_t temp = 0;
GPIOA_ModeCfg( ADC_PIN[adc_ch_seq[0]] |
ADC_PIN[adc_ch_seq[1]] |
ADC_PIN[adc_ch_seq[2]] |
ADC_PIN[adc_ch_seq[3]] |
ADC_PIN[adc_ch_seq[4]] |
ADC_PIN[adc_ch_seq[5]] |
ADC_PIN[adc_ch_seq[6]] |
ADC_PIN[adc_ch_seq[7]] |
ADC_PIN[adc_ch_seq[8]] |
ADC_PIN[adc_ch_seq[9]] |
ADC_PIN[adc_ch_seq[10]] |
ADC_PIN[adc_ch_seq[11]] |
ADC_PIN[adc_ch_seq[12]] |
ADC_PIN[adc_ch_seq[13]],
GPIO_ModeIN_Floating);
ADC_ExtSingleChSampInit(SampleFreq_4_or_2, ADC_PGA_0); //4M采样频率,0dB增益
R8_ADC_CONVERT |= RB_ADC_SAMPLE_TIME; //7个采样周期
ADC_ChannelCfg(adc_ch_seq[0]);
temp = (adc_ch_seq[1] << ADC_SCAN1_CH_IDX_1) |
(adc_ch_seq[2] << ADC_SCAN1_CH_IDX_2) |
(adc_ch_seq[3] << ADC_SCAN1_CH_IDX_3) |
(adc_ch_seq[4] << ADC_SCAN1_CH_IDX_4) |
(adc_ch_seq[5] << ADC_SCAN1_CH_IDX_5) |
(adc_ch_seq[6] << ADC_SCAN1_CH_IDX_6) |
(adc_ch_seq[7] << ADC_SCAN1_CH_IDX_7) |
(adc_ch_seq[8] << ADC_SCAN1_CH_IDX_8);
R32_ADC_SCAN_CFG1 = temp;
temp = 0;
temp = (adc_ch_seq[9] << ADC_SCAN2_CH_IDX_9) |
(adc_ch_seq[10] << ADC_SCAN2_CH_IDX_10) |
(adc_ch_seq[11] << ADC_SCAN2_CH_IDX_11) |
(adc_ch_seq[12] << ADC_SCAN2_CH_IDX_12) |
(adc_ch_seq[13] << ADC_SCAN2_CH_IDX_13);
ADC_AutoConverCycle(192);
// temp |= RB_ADC_SCAN_SEL | ((ADC_SCAN_CH_NUM - 1) << 24);
temp |= RB_ADC_SCAN_SEL | RB_ADC_IE_SCAN_END | ((ADC_SCAN_CH_NUM - 1) << 24);
R32_ADC_SCAN_CFG2 = temp;
ADC_DMACfg(ENABLE, (uint32_t)&adcBuff[0] , (uint32_t)&adcBuff[printLen] , ADC_Mode_LOOP);
// PFIC_EnableIRQ(ADC_IRQn);
ADC_StartAutoDMA();
}
__HIGH_CODE
__attribute__((noinline))
void Main_Circulation()
{
while(1)
{
TMOS_SystemProcess();
if(PRINT_flag == 1){
PRINT_flag = 0;
for (i = 0; i < 10; i++)
{
PRINT("%02d:%04d ",i, adcBuff[i]);
adcBuff[i] = 0;
}PRINT("\n");PRINT("\n");
}
}
}
VOID TMR_TEST(){
TMR0_TimerInit(FREQ_SYS / 10); // 设置定时时间 100ms
TMR0_ITCfg(ENABLE, TMR0_3_IT_CYC_END); // 开启中断
PFIC_EnableIRQ(TMR0_IRQn);
}
int main(void)
{
#if(defined(DCDC_ENABLE)) && (DCDC_ENABLE == TRUE)
PWR_DCDCCfg(ENABLE);
#endif
HSECFG_Capacitance(HSECap_18p);
SetSysClock(SYSCLK_FREQ);
#if(defined(HAL_SLEEP)) && (HAL_SLEEP == TRUE)
GPIOA_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_All, GPIO_ModeIN_PU);
#endif
#ifdef DEBUG
GPIOB_SetBits(GPIO_Pin_7);
GPIOB_ModeCfg(GPIO_Pin_4, GPIO_ModeIN_PU);
GPIOB_ModeCfg(GPIO_Pin_7, GPIO_ModeOut_PP_5mA);
UART0_DefInit();
UART0_BaudRateCfg(2000000);
#endif
GPIOB_SetBits(GPIO_Pin_0|GPIO_Pin_1);
GPIOB_ModeCfg(GPIO_Pin_0|GPIO_Pin_1, GPIO_ModeOut_PP_5mA);
PRINT("%s\n", VER_LIB);
CH58x_BLEInit();
HAL_Init();
GAPRole_PeripheralInit();
Peripheral_Init();
TMR_TEST();
R32_PIN_IN_DIS |= RB_PAx_IN_DIS; // 关闭数字输入
adc_scan_test();
mDelaymS(100);
Main_Circulation();
}
__INTERRUPT
__HIGH_CODE
void TMR0_IRQHandler(void) // TMR0 定时中断
{
if(TMR0_GetITFlag(TMR0_3_IT_CYC_END))
{
TMR0_ClearITFlag(TMR0_3_IT_CYC_END); // 清除中断标志
PRINT_flag = 1;
}
}
浙公网安备 33010602011771号