打印

航顺HK32F030M使用ADC切换通道时自动停止采集

[复制链接]
144|2
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
CoCo231|  楼主 | 2024-9-26 15:03 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
沙发
CoCo231|  楼主 | 2024-9-26 15:11 | 只看该作者

航顺HK32F030M使用ADC切换通道时自动停止采集

/*IO初始化*/
void ADC_GPIO_Config( void ) {
        GPIO_InitTypeDef GPIO_InitStructure;

        RCC_AHBPeriphClockCmd( RCC_AHBPeriph_GPIOC | RCC_AHBPeriph_GPIOD, ENABLE );
        RCC_APB2PeriphClockCmd( RCC_APB2Periph_ADC, ENABLE );

        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_2;
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;
        GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL;
        GPIO_Init( GPIOC, &GPIO_InitStructure );
        GPIO_Init( GPIOD, &GPIO_InitStructure );
        GPIO_PinAFConfig( GPIOC, GPIO_PinSource4, GPIO_AF_7 );
        GPIO_PinAFConfig( GPIOD, GPIO_PinSource2, GPIO_AF_7 );
}

/*ADC配置*/
void ADC_Config( void ) {
        ADC_GPIO_Config();
        ADC_DeInit( ADC1 );
        ADC_StructInit( &ADC_InitStructure );
        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;

        ADC_InitStructure.ADC_ContinuousConvMode = DISABLE;        ADC_InitStructure.ADC_ExternalTrigConv = ADC_ExternalTrigConvEdge_None;
        ADC_InitStructure.ADC_DataAlign = ADC_DataAlign_Right;        ADC_InitStructure.ADC_ScanDirection = ADC_ScanDirection_Upward;
        ADC_Init( ADC1, &ADC_InitStructure );
        PWR_SetLDO_RefVolToADC( ADC_VREF_LDO );
        //配置ADC采集通道
        ADC_ChannelConfig( ADC1, ADC_Channel[0], ADC_SampleTime_239_5Cycles );
        //启用ADC中断
        ADC_ITConfig( ADC1, ADC_IT_EOC, ENABLE );
        //使能ADC        ADC_Cmd( ADC1, ENABLE );
        //配置NVIC
        NVIC_InitStructure.NVIC_IRQChannel = ADC1_IRQn;
        NVIC_InitStructure.NVIC_IRQChannelPriority = 1;
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
        NVIC_Init( &NVIC_InitStructure );
        while (!ADC_GetFlagStatus( ADC1, ADC_FLAG_ADRDY ));
        ADC_StartOfConversion( ADC1 );
}

/*ADC中断处理函数*/
void ADC1_IRQHandler( void ) {
        static uint8_t a = 0;
        static Filter_Struct adc_voltage = { 0, 2300, 0 };
        static Filter_Struct adc_current3 = { 0, 25000, 0 };

        if (ADC_GetITStatus( ADC1, ADC_FLAG_EOC )) {
                ADC_ClearITPendingBit( ADC1, ADC_IT_EOC );
                ADC_data[a] = ADC_GetConversionValue( ADC1 );

                if (a == 0) {
                        adc_voltage.in_data = ((int32_t) ADC_data[a] * BUS_Voltage_constant) >> 15;
                        firstOrderFilter( &adc_voltage );
                        BUS_Voltage = adc_voltage.out_data;
                } else if (a == 1) {
                        adc_current3.in_data = ADC_data[a];
                        firstOrderFilter( &adc_current3 );
                        led3_current = (adc_current3.out_data * BLDC_current_constant) >> 15;
                        led3_adc_con();
                }
                a++;
                if (a > 1)
                        a = 0;
                ADC1->CHSELR = 0;
                ADC_ChannelConfig( ADC1, ADC_Channel[a], ADC_SampleTime_239_5Cycles );
                ADC_Cmd( ADC1, ENABLE );
                while (!ADC_GetFlagStatus( ADC1, ADC_FLAG_ADRDY ));
                ADC_StartOfConversion( ADC1 );
        }
}





使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1

主题

3

帖子

0

粉丝