打印

[APM32F072] 关于定时器触发ADC采样多通道转换值如何获取?

[复制链接]
322|0
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
skylinyk|  楼主 | 2022-7-26 23:04 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
用的是APM32F072RBT6官方例程,修改ADC采样通道为ADC8--PB0  ADC9--PB1,例程只要单通道转换,请教大神如何获取两个通道的值,代码需要配置哪些参数?int main(void)
{
    uint32_t adcData = 0;
    uint32_t voltage = 0;
          uint32_t adcData2 = 0;
    uint32_t voltage2 = 0;

    APM_MINI_LEDInit(LED2);
    APM_MINI_LEDInit(LED3);
    APM_MINI_COMInit(COM1);

    /** TMR1 Configuration */
    TMR1Init();

    /** ADC Configuration */
    ADCInit();

    /** Wait until ADC is ready */
    while (!ADC_ReadStatusFlag(ADC_FLAG_ADRDY));

    ADC_StartConversion();

    for (;;)
    {               
        while (ADC_ReadStatusFlag(ADC_FLAG_CC) == RESET);
        /** Read ADC Conversion value*/
        adcData = ADC_ReadConversionValue();
        /**  voltage(mV) =  adcData * (3300mV / 4095) */
        voltage = (adcData*3300)/4095;
        /** output to serial port*/
        printf("\r\n volatage : %d\r\n", voltage);
    }                               
}

void ADCInit(void)
{
    GPIO_Config_T gpioConfig;
    ADC_Config_T  adcConfig;

    /** RCM Enable*/
    RCM_EnableAHBPeriphClock(RCM_AHB_PERIPH_GPIOB);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_ADC1);
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_SYSCFG);
    /** GPIO Configuration */
    gpioConfig.pin = GPIO_PIN_0|GPIO_PIN_1;
    gpioConfig.mode = GPIO_MODE_AN;
    gpioConfig.pupd = GPIO_PUPD_PU;
    GPIO_Config(GPIOB, &gpioConfig);
    /** ADC Configuration */
    ADC_Reset();
    ADC_ConfigStructInit(&adcConfig);
    /** Set resolution*/
    adcConfig.resolution = ADC_RESOLUTION_12B;
    /** Set dataAlign*/
    adcConfig.dataAlign = ADC_DATA_ALIGN_RIGHT;
    /** Set scanDir*/
    adcConfig.scanDir = ADC_SCAN_DIR_UPWARD;
    /** Set convMode continous*/
    adcConfig.convMode   = ADC_CONVERSION_SINGLE;
//                adcConfig.convMode   = ADC_CONVERSION_CONTINUOUS;
    /** Set extTrigConv*/
    adcConfig.extTrigConv  = ADC_EXT_TRIG_CONV_TRG1;
    /** Set TrigEdge*/
    adcConfig.extTrigEdge = ADC_EXT_TRIG_EDGE_RISING;

    ADC_Config(&adcConfig);
               
    ADC_ConfigChannel(ADC_CHANNEL_8 , ADC_SAMPLE_TIME_239_5);
//    ADC_ConfigChannel(ADC_CHANNEL_9 , ADC_SAMPLE_TIME_239_5);
    /** Calibration*/
    ADC_ReadCalibrationFactor();
    /** Enable ADC*/
    ADC_Enable();
}

/*!
* @brief       TMR1 Init
*
* @param       None
*
* @retval      None
*
* @note
*/
void TMR1Init(void)
{
    TMR_TimeBase_T  timeBaseConfig;
    TMR_OCConfig_T  occonfig;

    /** Enable Clock*/
    RCM_EnableAPB2PeriphClock(RCM_APB2_PERIPH_TMR1);

    /** Set clockDivision = 1 */
    timeBaseConfig.clockDivision =  TMR_CKD_DIV1;
    /** Up-counter */
    timeBaseConfig.counterMode =  TMR_COUNTER_MODE_UP;
    /** Set divider = 47.So TMR1 clock freq ~= 48/(47 + 1) = 1MHZ */
    timeBaseConfig.div = 4799 ;
    /** Set counter = 0xff */
    timeBaseConfig.period = 0xFF;
    /** Repetition counter = 0x0 */
    timeBaseConfig.repetitionCounter =  0;
    TMR_ConfigTimeBase(TMR1, &timeBaseConfig);

    /** PWM1 mode */
    occonfig.OC_Mode =  TMR_OC_MODE_PWM1;
    /** Idle State is reset */
    occonfig.OC_Idlestate  = TMR_OCIDLESTATE_RESET;
    /** NIdle State is reset */
    occonfig.OC_NIdlestate = TMR_OCNIDLESTATE_RESET;
    /** Enable CH1N ouput */
    occonfig.OC_OutputNState =  TMR_OUTPUT_NSTATE_ENABLE;
    /** Enable CH1 ouput */
    occonfig.OC_OutputState  =  TMR_OUTPUT_STATE_ENABLE;
    /** CH1  polarity is high */
    occonfig.OC_Polarity  = TMR_OC_POLARITY_HIGH;
    /** CH1N polarity is high */
    occonfig.OC_NPolarity = TMR_OC_NPOLARITY_HIGH;
    /** Set compare value = 0x01 */
    occonfig.Pulse = 0x1;
    TMR_OC4Config(TMR1, &occonfig);

    /** Enable PWM output */
    TMR_EnablePWMOutputs(TMR1);
    /**  Enable TMR1  */
    TMR_Enable(TMR1);
}


使用特权

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

本版积分规则

3

主题

21

帖子

1

粉丝