打印
[N32G03x]

ADC定时器触发注入通道转换时刻点不正确

[复制链接]
772|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
禁基的矮子|  楼主 | 2022-9-6 10:36 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
ADC注入通道设置为扫描模式,TIM1_CC4事件触发转换,但是使用示波器发现ADC转换的触发时刻是定时器更新事件,更换使用TIM8_CC4触发依旧是更新事件触发

使用特权

评论回复
沙发
芯路例程| | 2022-9-6 11:47 | 只看该作者
你是想设置成什么方式触发?

使用特权

评论回复
板凳
禁基的矮子|  楼主 | 2022-9-6 12:21 | 只看该作者
芯路例程 发表于 2022-9-6 11:47
你是想设置成什么方式触发?

高级定时器控制电机,使用TIM1_CC4设置ADC采样点。
硬件触发的方式不正确的话,就准备用软件触发了

使用特权

评论回复
地板
芯路例程| | 2022-9-6 13:35 | 只看该作者
禁基的矮子 发表于 2022-9-6 12:21
高级定时器控制电机,使用TIM1_CC4设置ADC采样点。
硬件触发的方式不正确的话,就准备用软件触发了 ...

所以你想通过设置TIM1_CC4来控制ADC的采样周期?

使用特权

评论回复
5
禁基的矮子|  楼主 | 2022-9-6 13:35 | 只看该作者
本帖最后由 禁基的矮子 于 2022-9-6 13:39 编辑

这是我根据官方例程TIMTrigger_AutoInjection将规则通道取消后的测试代码
#include "misc.h"
#include "n32g031_adc.h"
#include "n32g031_gpio.h"
#include "n32g031_rcc.h"
#include "n32g031_tim.h"

ADC_InitType ADC_InitStructure;
TIM_TimeBaseInitType TIM_TimeBaseStructure;
OCInitType TIM_OCInitStructure;
__IO uint16_t  ADC_InjectedConvertedValueTab[32];
__IO uint32_t Index;

void RCC_Configuration(void);
void GPIO_Configuration(void);
void NVIC_Configuration(void);

int main(void)
{
    /* System clocks configuration ---------------------------------------------*/
    RCC_Configuration();

    /* NVIC configuration ------------------------------------------------------*/
    NVIC_Configuration();

    /* GPIO configuration ------------------------------------------------------*/
    GPIO_Configuration();

    /* TIM1 configuration ------------------------------------------------------*/
    /* Time Base configuration */
    TIM_InitTimBaseStruct(&TIM_TimeBaseStructure);
    TIM_TimeBaseStructure.Period = 3000 - 1; // 0xFF;
    TIM_TimeBaseStructure.Prescaler = 0;
    TIM_TimeBaseStructure.ClkDiv = 0x0;
    TIM_TimeBaseStructure.CntMode = TIM_CNT_MODE_UP;
    TIM_InitTimeBase(TIM1, &TIM_TimeBaseStructure);
    /* TIM1 channel1 configuration in PWM mode */
    TIM_OCInitStructure.OcMode = TIM_OCMODE_PWM1;
    TIM_OCInitStructure.OutputState = TIM_OUTPUT_STATE_ENABLE;
    TIM_OCInitStructure.Pulse = 2400 - 1;
    TIM_OCInitStructure.OcPolarity = TIM_OC_POLARITY_HIGH;
    TIM_InitOc4(TIM1, &TIM_OCInitStructure);

    /* ADC configuration ------------------------------------------------------*/
    ADC_InitStructure.MultiChEn = ENABLE;
    ADC_InitStructure.ContinueConvEn = DISABLE;
    ADC_InitStructure.ExtTrigSelect = ADC_EXT_TRIGCONV_NONE;
    ADC_InitStructure.DatAlign = ADC_DAT_ALIGN_R;
    ADC_InitStructure.ChsNumber = 1;
    ADC_Init(ADC, &ADC_InitStructure);

    /* Set injected sequencer length */
    ADC_ConfigInjectedSequencerLength(ADC, 2);
    /* ADC injected channel Configuration */
    ADC_ConfigInjectedChannel(ADC, ADC_CH_0_PA0, 1, ADC_SAMP_TIME_6CYCLES5);
    ADC_ConfigInjectedChannel(ADC, ADC_CH_1_PA1, 2, ADC_SAMP_TIME_6CYCLES5);
    /* ADC injected external trigger configuration */
    ADC_ConfigExternalTrigInjectedConv(ADC, ADC_EXT_TRIG_INJ_CONV_T1_CC4);
    /* Enable automatic injected conversion start after regular one */
    ADC_EnableAutoInjectedConv(ADC, DISABLE);
    /* Enable JEOC interrupt */
    ADC_ConfigInt(ADC, ADC_INT_JENDC, ENABLE);

    /* Enable ADC external trigger */
    ADC_EnableExternalTrigInjectedConv(ADC, ENABLE);

    /* Enable ADC */
    ADC_Enable(ADC, ENABLE);

    /*wait ADC is ready to use*/
    while (!ADC_GetFlagStatusNew(ADC, ADC_FLAG_RDY))
        ;
    /*wait ADC is powered on*/
    while (ADC_GetFlagStatusNew(ADC, ADC_FLAG_PD_RDY))
        ;

    /* TIM1 counter enable */
    TIM_Enable(TIM1, ENABLE);
    /* TIM1 main Output Enable */
    TIM_EnableCtrlPwmOutputs(TIM1, ENABLE);

    while (1) {
    }
}

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]  Configures the different system clocks.
*/
void RCC_Configuration(void)
{
    ErrorStatus HSIStartUpStatus;
    /* Enable peripheral clocks ------------------------------------------------*/
    /* Enable TIM1 clocks */
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_TIM1, ENABLE);

    /* Enable GPIO clocks */
    RCC_EnableAPB2PeriphClk(RCC_APB2_PERIPH_GPIOA | RCC_APB2_PERIPH_GPIOB, ENABLE);
    /* Enable ADC clocks */
    RCC_EnableAHBPeriphClk(RCC_AHB_PERIPH_ADC, ENABLE);

    /* RCC_ADCHCLK_DIV16*/
    ADC_ConfigClk(ADC_CTRL3_CKMOD_AHB, RCC_ADCHCLK_DIV3);

    /* enable ADC1M clock */
    RCC_EnableHsi(ENABLE);

    /* Wait til1 HSI is ready*/
    HSIStartUpStatus = RCC_WaitHsiStable();
    if (HSIStartUpStatus == SUCCESS) {
    }
    else {
        /* If HSI fails to start-up, the application will have wrong clock configuration. User can add here some code to
         * deal with this error*/
        /* Go to infinital 1oop*/
        while (1) {
        }
    }

    RCC_ConfigAdc1mClk(RCC_ADC1MCLK_SRC_HSI, RCC_ADC1MCLK_DIV8);
}

/**
* [url=home.php?mod=space&uid=247401]@brief[/url]  Configures the different GPIO ports.
*/
void GPIO_Configuration(void)
{
    GPIO_InitType GPIO_InitStructure;

    GPIO_InitStruct(&GPIO_InitStructure);
    /* Configure TIM1_CH4(PA11) as alternate function push-pull */
    GPIO_InitStructure.Pin = GPIO_PIN_11;
    GPIO_InitStructure.GPIO_Current = GPIO_DC_LOW;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_AF_PP;
    GPIO_InitStructure.GPIO_Alternate = GPIO_AF2_TIM1;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);

    /* Configure PB.07 as output push-pull */
    GPIO_InitStructure.Pin = GPIO_PIN_7;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_OUTPUT_PP;
    GPIO_InitPeripheral(GPIOB, &GPIO_InitStructure);

    /* Configure PA.00 and PA.01 as analog input */
    GPIO_InitStructure.Pin = GPIO_PIN_0 | GPIO_PIN_1;
    GPIO_InitStructure.GPIO_Mode = GPIO_MODE_ANALOG;
    GPIO_InitPeripheral(GPIOA, &GPIO_InitStructure);
}

/**
* @brief  Configures NVIC and Vector Table base location.
*/
void NVIC_Configuration(void)
{
    NVIC_InitType NVIC_InitStructure;

    /* Configure and enable ADC interrupt */
    NVIC_InitStructure.NVIC_IRQChannel = ADC_IRQn;
    NVIC_InitStructure.NVIC_IRQChannelPriority = 0;
    NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
    NVIC_Init(&NVIC_InitStructure);
}

/**
* @brief  This function handles ADC global interrupts requests.
*/
void ADC_IRQHandler(void)
{
    /* Set PA.06 pin */
    GPIOB->PBSC = GPIO_PIN_7;
    /* Get injected channel11 converted value */
    if (Index >= sizeof(ADC_InjectedConvertedValueTab) / sizeof(ADC_InjectedConvertedValueTab[0])) {
        Index = 0;
    }
    ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionDat(ADC, ADC_INJ_CH_1);
    ADC_InjectedConvertedValueTab[Index++] = ADC_GetInjectedConversionDat(ADC, ADC_INJ_CH_2);
    /* Clear ADC JEOC pending interrupt bit */
    ADC_ClearIntPendingBit(ADC, ADC_INT_JENDC);
    /* Reset PA.06 pin */
    GPIOB->PBC = GPIO_PIN_7;
}


  

使用特权

评论回复
6
禁基的矮子|  楼主 | 2022-9-6 15:18 | 只看该作者
芯路例程 发表于 2022-9-6 13:35
所以你想通过设置TIM1_CC4来控制ADC的采样周期?

是通过TIM1_CC4控制ADC的采样时刻

使用特权

评论回复
7
芯路例程| | 2022-9-7 13:14 | 只看该作者
禁基的矮子 发表于 2022-9-6 15:18
是通过TIM1_CC4控制ADC的采样时刻

用到操作系统了吗?如果用到就在定时器里面发送一个信号量。

使用特权

评论回复
8
禁基的矮子|  楼主 | 2022-9-7 21:26 | 只看该作者
芯路例程 发表于 2022-9-7 13:14
用到操作系统了吗?如果用到就在定时器里面发送一个信号量。

根据手册可以使用比较事件硬件触发,既然有问题,只好在比较中断中软件触发

使用特权

评论回复
9
芯路例程| | 2022-9-15 11:37 | 只看该作者
禁基的矮子 发表于 2022-9-7 21:26
根据手册可以使用比较事件硬件触发,既然有问题,只好在比较中断中软件触发 ...

是的,只能考虑这种方法了!

使用特权

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

本版积分规则

12

主题

59

帖子

0

粉丝