This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] CCS/MSP430F5359:在 MSP430F5359上触发 ADC12采样

Guru**** 2024750 points
Other Parts Discussed in Thread: MSP430F5359
请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/744830/ccs-msp430f5359-triggering-adc12-sampling-on-msp430f5359

器件型号:MSP430F5359

工具/软件:Code Composer Studio

我在 CCS 中将 MSP430F5359与 MSP-TS430PZ100C 开发工具搭配使用、并将 ADC12模块与 MSP 驱动程序库搭配使用。  

我想  使用 TimerA 每4ms 触发一次 ADC12采样、并在该周期内抓取32个样本。  

下面是我到目前为止所取得的成就、并希望获得一些指导来进一步推动这一目标。  

#include "driverlib.h"
#define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0

//---pilots
void setupADC (void);


//--globals
volatile uint16_t data;

//---main
void main (void)
{
//停止看门狗计时器
WDT_A_HOLD (WDT_A_base);

// ADC 设置
setupADC();

while (1)
{
//开始单次转换,无重复或序列。
ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_SINGLECHANNEL);

//等待中断标志生效
while (!(ADC12_A_getInterruptStatus (ADC12_A_base、ADC12IFG0)));

//获取值
数据= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);

//清除中断标志并启动另一个转换
ADC12_A_clearInterrupt (ADC12_A_base、ADC12IFG0);
}
}

//--setup ADC
void setupADC (void)
{
//设置 ADC 引脚
GPIO_setPeripheralModuleFunctionInputPin (ADCpin);

//初始化 ADC12_A 模块
/* ADC12_A 模块的基地址
*使用内部 ADC12_A 位作为采样/保持信号来启动转换
*使用 MODOSC 5MHZ 数字振荡器作为时钟源
*使用默认的时钟分频器1
*
ADC12_A_init (ADC12_A_base、
ADC12_A_SAMPLEHOLDSOURCE_SC、
ADC12_A_CLOCKSOURCE_ADC12OSC、
ADC12_A_CLOCKDIVIDER_1);


//将采样计时器设置为采样保持32个时钟周期
ADC12_A_setupSamplingTimer (ADC12_A_base、
ADC12_A_CYCLEHOLD_32_CYCLES、
ADC12_A_CYCLEHOLD_32_CYCLES、
ADC12_A_MULTIPLESAMPLESDISABLE);


//使用指定的基准电压配置存储器缓冲器
/* ADC12_A 模块的基地址
*配置内存缓冲区0
*将输入 A12映射到存储器缓冲器0
* VREF+= AVCC (内部)
* Vref-= AVSS
*内存缓冲区0不是序列的末尾
*
ADC12_A_configureMemoryParam param ={0};
param.memoryBufferControlIndex = ADC12_a_memory_0;
param.inputSourceSelect = ADC12_A_INPUT_A0;
param.positiveRefVoltageSourceSelect = ADC12_A_VREFPOS_AVCC;
param.inveRefVoltageSourceSelect = ADC12_A_VREFNEG_AVSS;
param.endOfSequence = ADC12_A_NOTENDOSEQUENCE;
ADC12_A_configureMemory (ADC12_A_base、&param);

//打开 ADC12
ADC12_A_ENABLE (ADC12_A_base);

//启用存储器缓冲器0中断
ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);

} 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Pulin、

    您是否了解了 MSP 驱动程序库中提供的代码示例? 查看不同的示例并将其用作指导可能是一个良好的起点。 确保检查 MSP430F5xx 器件系列的代码示例。
    这些示例还将展示如何使用低功耗模式和中断来节省应用中的功耗。
    查看这些示例后、如果您有其他问题、请告诉我。
    此致、
    Britta
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    好的、让我从更具体的开始、如何将 SMCLK 设置为16MHz、以便当我的计时器 A 可以使用它时、得到我需要的4ms 周期? 我想使用 MSP430驱动程序库来实现这一点。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Pulin、

    配置 SMCLK 的第一个起点是查看 用户指南 第5节统一时钟系统(UCS)。 请查看您将使用什么源以16MHz 的频率为 SMCLK 提供源。 在 MSP430驱动程序库中、我们提供了不同 的 UCS 配置示例、这些示例可能有助于您入门、尽管我们没有针对您所需设置的确切示例、因此需要进行一些自适应。

    正确设置时钟系统后、您可以将 SMCLK 用作 Timer_A 时钟。

    希望这能帮助您向前迈进。

    此致、

    Britta

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Britta、

    我已经按照以下方式修改了我的代码、以实现 SMCLK 的16MHz。  

    这就是我得到的。 我希望您能在下面确认一切正常。

    现在、我已经开始为计时器 A 进行编码、但需要有关其与 ADC12及其中断例程的用法的进一步指导。 希望您能提供提示。

    #include "driverlib.h"
    
    //--#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    
    #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主机时钟(CPU) REGLE 16MHz
    #define FLLREF_kHz /Reference FREQUENCY (void
    
    
    
    
    
    
    
    
    
    
    
    )(void MCLMCL12_kHz)/MCLCLUST_LMCLK);设置为32.nvoid (void /MCLMCLMCLK)/TIVACLK (void (void)/MCLMCL12_kHz);设置为32.LMCLK (void (void (void)/MCLMCLMCL12_kHz)/MCLK);t/ // ADC 数据
    
    uint32_t MCLK = 0;//MCLK
    uint32_t smclk = 0;//SMCLK
    uint32_t aclk = 0;//ACLK
    
    
    
    //--main
    void main (void)
    {
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    //设置时钟
    initClocks();
    
    //计时器设置
    setupTimer();
    
    //ADC 设置
    setupADC();
    
    while (1)
    {
    //开始单次转换,无重复或序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_SINGLECHANNEL);
    //等待中断标志生效
    while (!(ADC12_A_getInterruptStatus (ADC12_A_base、ADC12IFG0)));
    //获取值
    数据= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    //清除中断标志并启动另一个转换
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IFG0);
    }
    }//--setup
    
    timer
    void setupTimer(void){
    
    Timer_A_initContinuousModeParam ={0};
    param.clockSource |= TIMER_A_CLOCKSOURCE_SMCLK;
    param.clockSourceDivider |= TIMER_A_CLOCKSOURCE_divider;
    param.startTimer |= false;
    }
    
    
    
    
    //-setup 系统时钟
    void initClocks(void){
    
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //设置比率和所需的 MCLK 频率并初始化 DCO
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    }
    
    
    //--setup ADC
    void setupADC (void)
    {
    
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1);
    
    
    //将采样计时器设置为采样保持64个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer (ADC12_A_base、
    ADC12_A_CYCLEHOLD_64_CYCLES、
    ADC12_A_CYCLEHOLD_64_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE);
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //打开 ADC12
    ADC12_A_ENABLE (ADC12_A_base);
    //启用存储器缓冲器0中断
    // ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    }
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    根据您当前的代码:我建议启用振荡器故障中断。 在 UCS_ex1_DCO12MHz 代码示例中、您将找到合适的 driverlib 函数来执行此操作。
    对于计时器和中断配置、我首先建议查看用户指南以及 ADC12和计时器的 driverlib 示例代码。 此外、请查看数据表、哪些计时器实例可用于触发 ADC。 不同的 ADC 示例应该已经对您有所帮助、尤其是在中断设置方面。 用户指南将帮助您了解所需行为所需的设置。

    此致、
    Britta
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Britta、

    如果您参考数据表中的 ADC12SHSx、我可以看到计时器 A0链接到 ADC12_A_SAMPLEHOLDSOURCE_1

    那么我的 ADC init 语句 :

      ADC12_A_init (
             ADC12_A_base、
             ADC12_A_SAMPLEHOLDSOURCE_1、   
             ADC12_A_CLOCKSOURCE_ADC12OSC、
             ADC12_A_CLOCKDIVIDER_1
       );

    但代码似乎不起作用。

    #include "driverlib.h"
    
    //- -#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_of _Samples 32 //喜欢抓取32个样本
    #define COMPARE_VALUE 50000
    
    
    
    
    //相关时钟
    #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz
    #define COMPARE_LLRLL_CALCFFEFFT / FREE_FREE/ FREE/ FREE= 32.768kHz (
    FLL_FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE/ FREE= 32.768kHz)
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    -void void setupADC (void);void initTimer (void);void initClocks (void);//--globals volatile uint16_t DATA[No_for_Samples];// ADC Data uint32_t MCLK = 0;//MCLK uint32_t smclk = 0;//SMCLK uint32_t 状态
    = 0;/t intruint32;/uintuat_t uintma-void = 0
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    setupADC();
    
    //启用全局中断
    _bis_SR_register (GIE);
    
    __no_operation();//对于调试
    
    器}
    
    //设置以 SMCLK
    void initTimer(void){为源的连续模式计时器
    
    Timer_A_initContinuousModeParam ={0};
    param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    param.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    param.timerClear = timer_a_do _clear;
    param.startTimer = false;
    Timer_A_initContinuousMode (timer_A0_BASE、&param);
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (timer_A1_base、timer_A_CAPTURECOMPARE 寄存器_0);
    Timer_A_initCompareModeinitCompParam ={0};
    initCompParam.compareRegister
    
    
    initCompParam.compareValue = TIMER_A_CAPTURMPARE 寄存器0;initCompParam.compareInterruptEnable = TIMER_A_URECOMPE_= initCompParam.compareOutputMode;TIMER_OUTAULT_INTERRUT_TALT_TAMOUNT =
    Timer_A_initCompareMode (timer_A1_base、&initCompParam);
    
    Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode);
    
    }
    
    //-setup 系统时钟
    void initClocks (void)
    {
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void setupADC (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持64个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_64_CYCLES、
    ADC12_A_CYCLEHOLD_4_CYCLES、
    ADC12_A_MULTIPLESAMPLESENABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);
    
    
    }
    
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    switch (__evo_in_range (ADC12IV、34)){
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    }
    
    
    
    #pragma vector=Timer1_A0_vector
    __interrupt
    
    void Timer1_A0_ISR (void)
    {
    uint16_t compVal = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_CAPTURECMOLE_REGISTER_0)+ COMPARE_VALUE;
    
    //Toggle P1.0 //上面有绿色 LED
    GPIO_toggleOutputOnPin (
    GPIO_PORT_P1、
    GPIO_PIN0
    );
    
    //将偏移添加到 CCR0
    Timer_A_setCompareValue (timer_A1_base、
    Timer_A_CAPTURECMPARE 寄存器0、
    COMPVal
    );
    }
    
    
    #pragma vector=UNMI_VECTOR
    __INTERRUPT void NMI_ISR (void)
    {
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_0;
    根据数据表、表6-14、SHS=1指的是 TA0.1、而不是 TA0.0。 您需要改为使用 TIMER_A_CAPTURECOMPARE 寄存器_1 (CCR1)。 TA0.0没有 SHS、因此您不能只是更改它。

    有几个基准需要为此进行修复。 您还需要更改为
    #pragma vector=Timer1_A1_vector
    您需要在 ISR 中明确清除 CCR1中断、如下所示:
    > Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1);
    ------------------
    > initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_OUTBITVALUE;
    您需要生成一个实际的波形来执行触发、OUTBITVALUE 不会这样做。 尝试 TIMER_A_OUTPUTMODE_SET_RESET。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、  

    我根据您的建议进行了更改、但也将 ADC12_A_startConversion 移到了计时器 ISR 中。 这是正确的方法吗?  

    因此、如果计时器溢出频率为250Hz、SMCLK 为16MHz、则4ms 由64000表示为 CCR1的计数值  

    此外,  当 ADC12_A_SAMPLEHOLDSOURCE_1被更改为 ADC12_A_SAMPLEHOLDSOURCE_SC 时,它的运行方式似乎是正常的。 否则它不起作用

    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、   <--当这个值更改为 ADC12_A_SAMPLEHOLDSOURCE_SC 时,它看起来会起作用。

    ADC12_A_CLOCKSOURCE_ADC12OSC、

    ADC12_A_CLOCKDIVIDER_1
    );





    #include "driverlib.h" //- -#define #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0 #define No_of _Samples 32 //喜欢抓取32个样本 #define COMPARE_VALUE 64000 //时钟相关 #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz #define COMPARE_LLRL_BREF_RATION 32.768kHz / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_for_Samples];// ADC Data volatile uint16_t comparevalue;uint32_t MCLK = 0;//mctruint32 = uint/uint32;/uintuintuint32 u/uintuintuintuintu/t uintuintuintk = uint32;/uintuintuint32 uintuintuintuintuintuintu.uintma-u/uint //停止看门狗计时器 WDT_A_HOLD (WDT_A_base); //配置 GPIO 端口/引脚 initGPIO(); //设置时钟 initClocks(); //验证时钟设置是否符合预期 MCLK = UCS_getMCLK (); aclk = UCS_getACLK (); smclk = UCS_getSMCLK (); //计时器设置 initTimer(); //ADC 设置 initadC(); //启用全局中断 _bis_SR_register (GIE); } void initGPIO (void) { //将 P1.0设置为输出 GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0); } //-以 SMCLK void initTimers (void)为源的连续模式设置计时器 { Timer_A_initContinuousModeParam ={0}; param.clockSource = TIMER_A_CLOCKSOURCE_SMCLK; param.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider; param.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE; param.timerClear = timer_a_do _clear; param.startTimer = false; Timer_A_initContinuousMode (timer_A1_base、&param); //初始化比较模式 Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1); Timer_A_initCompareModeParam initCompParam ={0}; initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1; initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE; initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET; initCompParam.compareValue = COMPARE_VALUE; Timer_A_initCompareMode (timer_A1_base、&initCompParam); Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode); } //-setup 系统时钟 void initClocks(void) { //设置 DCO FLL 基准= REFO UCS_initClockSignal ( UCS_FLLREF、 频率锁定环路的//基准 UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器 UCS 时钟分频器1 ); //设置 ACLK = REFO 设置辅助时钟 UCS_initClockSignal ( UCS_ACLK、 UCS_REFOCLK_SELECT、 UCS 时钟分频器1 ); //启动 FLL 并让其稳定下来 //这将自动成为 MCLK 和 SMCLK //设置所需的频率并加载比率 UCS_initFLSettle ( MCLK_REVed_frequency in_kHz、 MCLK_FLLREF_Ratio ); //启用全局振荡器故障标志 SFR_clearInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); SFR_enableInterrupt ( SFR_Oscillator_FAULT_INTERRUPT ); } //--setup ADC void initadc (void) { //设置 ADC 引脚 GPIO_setPeripheralModuleFunctionInputPin (ADCpin); //初始化 ADC12_A 模块 /* ADC12_A 模块的基地址 *使用内部 ADC12_A 位作为采样/保持信号来启动转换 *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源 *使用默认的时钟分频器1 * ADC12_A_init ( ADC12_A_base、 ADC12_A_SAMPLEHOLDSOURCE_SC、 ADC12_A_CLOCKSOURCE_ADC12OSC、 ADC12_A_CLOCKDIVIDER_1 ); ADC12_A_ENABLE (ADC12_A_base); //将采样计时器设置为采样保持64个时钟周期 /* ADC12_A 模块的基地址 *对于内存缓冲区0-7采样/保持、持续64个时钟周期 *对于内存缓冲区8-15个采样/保持、持续64个时钟周期 *禁用多路采样 * ADC12_A_setupSamplingTimer() ADC12_A_base、 ADC12_A_CYCLEHOLD_64_CYCLES、 ADC12_A_CYCLEHOLD_4_CYCLES、 ADC12_A_MULTIPLESAMPLESENABLE ); //使用指定的基准电压配置存储器缓冲器 /* ADC12_A 模块的基地址 *配置内存缓冲区0 *将输入 A12映射到存储器缓冲器0 * VREF+= VREF+(内部) * Vref-= AVSS *内存缓冲区0不是序列的末尾 * ADC12_A_configureMemoryParam param ={0}; param.memoryBufferControlIndex |= ADC12_a_memory_0; param.inputSourceSelect |= ADC12_A_INPUT_A0; param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC; param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS; param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE; ADC12_A_configureMemory (ADC12_A_base、&param); //启用存储器缓冲器0中断 ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0); ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0); //开始单次转换,无重复或序列。 // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL); } #pragma vector = ADC12_vector __interrupt void ADC12_ISR (void) { 静态 uint8_t 索引= 0; switch (__evo_in_range (ADC12IV、34)){ 情况0:中断;//Vector 0:无中断 情况2:中断;//Vector 2:ADC 溢出 情况4:中断;//矢量4:ADC 时序溢出 案例6: //向量6:ADC12IFG0 //移动结果 DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0); //递增结果索引,模数; //set Breakpoint1此处并观察结果[] 索引++; 如果(索引==32) { 索引= 0; } 情况8:中断;//Vector 8:ADC12IFG1 情况10:中断;//Vector 10:ADC12IFG2 情况12:中断;//向量12:ADC12IFG3 案例14:中断;//Vector 14:ADC12IFG4 情况16:中断;//向量16:ADC12IFG5 情况18:中断;//Vector 18:ADC12IFG6 情况20:中断;//Vector 20:ADC12IFG7 情况22:中断;//Vector 22:ADC12IFG8 情况24:中断;//Vector 24:ADC12IFG9 情况26:中断;//Vector 26:ADC12IFG10 情况28:中断;//Vector 28:ADC12IFG11 情况30:中断;//Vector 30:ADC12IFG12 情况32:中断;//Vector 32:ADC12IFG13 案例34:中断;//Vector 34:ADC12IFG14 默认值:break; } } #pragma vector=Timer1_A1_vector __interrupt void Timer1_A1_ISR (void) { comparevalue = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_CAPTURECMPare_register_1); //切换绿色 LED GPIO_toggleOutputOnPin (GPIO_PORT_P1、GPIO_PIN0); //开始 ADC 转换。 ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL); Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1); } #pragma vector=UNMI_Vector __interrupt void NMI_ISR (void) { 执行{ //如果在超时后仍然无法清除振荡器故障标志, //在此处捕获并等待。 状态= UCS_clearAllOscFlagsWithTimeout (1000); } while (status!= 0); }

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    "不起作用"是指 ADC 根本不运行、还是运行过快? 我对该代码的读取表明第二个代码。

    > ADC12_A_MULTIPLESAMPLESENABLE
    结合 CONSEQ=2 (ADC12_A_REPEDIATE_SNGLECHANNEL)、这将以最快的速度运行 ADC、我认为这不是目标。 我建议您将其替换为:
    >ADC12_A_REPLEASE_SINGLECHANNELDISABLE // MSC=0
    这将重复单个通道、但由计时器起搏。 那么我想您可以后退
    >ADC12_A_SAMPLEHOLDSOURCE_1、// SHS=1
    并将 ADC12_A_startConversion 调用移回 main。

    [编辑:这里的关键是 startConversion 将设置 ENC=1、这将允许计时器触发 ADC。 它还将设置 SC、但这将被忽略、因为 SHS!= 0。]

    [编辑:用户指南(SLAU208Q)中的图表图 28-9对于跟踪 CONSEQ=2、MSC 和 SHS ("触发器")之间的交互非常有用。]
    ----------
    由于您在连续模式下运行计时器、因此周期将为65536个周期(~244Hz)。 您在周期中触发64000个周期这一事实不会改变周期。

    在之前的版本中、您是通过每次将 CCR0前移一个周期来实现这一点的、而做同样的事情(使用 CCR1)将在这里正常工作。

    您还可以切换到向上计数模式、对周期(CCR0)使用 cycle_count、对 CCR1比较使用 cycle_count/2。

    第一个(向前移动 CCR1)可能是最小的变化--只需调整您之前代码的行:
    > Timer_A_setCompareValue (timer_A1_base、timer_A_CAPTURECOMPARE 寄存器_1、compVal+cycle_count);

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    ADC12_A_REPEDIATE_SINGLECHANNELDISABLE 作为一个选项不存在(查看 ADC12_a.h)、因此选择 ADC12_A_SINGLECHANNEL (ADC12CONSEQ_0)

    根据您的建议、将其保留在连续模式和其他更改。 我可以看到、ADC 没有触发。 是否确定计时器的实例应为 Timer1_A3?

    #include "driverlib.h"
    
    //- -#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_of _Samples 32 //喜欢抓取32个样本
    #define COMPARE_VALUE 64000
    
    
    //时钟相关
    #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz
    #define COMPARE_LLRL_BREF_RATION 32.768kHz
    / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_for_Samples];// ADC Data uint32_t MCLK = 0;//MCLK uint32_t smclk = 0;/t intruint32;/uintu/uintuintu/t status/t inuint32;/uintuintu/uintmain_t_uintmain_t_uintk = 0
    
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    
    //配置 GPIO 端口/引脚
    initGPIO();
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    initadC();
    
    //启用全局中断
    _bis_SR_register (GIE);
    
    }
    
    
    void initGPIO (void)
    {
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    
    
    //-setup 计时
    器 void initTimers (void)
    {
    
    
    
    //以 SMCLK 为源的连续模式中的启动定时器
    Timer_A_initContinuousModeParam initContParam ={0};
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initContParam.timerClear = timer_a_do _clear;
    initContParam.startTimer = false;
    Timer_A_initContinuousMode (timer_A1_base、&initContParam);
    
    
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1);
    
    Timer_A_initCompareModeParam initCompParam ={0};
    initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1;
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE;
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
    initCompParam.compareValue = COMPARE_VALUE;
    Timer_A_initCompareMode (timer_A1_base、&initCompParam);
    
    Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode);
    
    }
    
    
    //-setup 系统时钟
    void initClocks (void)
    {
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void initadc (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持64个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_SINGLECHANNEL);
    
    
    }
    
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    switch (__evo_in_range (ADC12IV、34)){
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    }
    
    
    
    #pragma vector=Timer1_A1_vector
    __interrupt
    
    void Timer1_A1_ISR (void)
    {
    
    uint16_t compVal = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_Value URECOMPare_register_1)+ COMPARE_VALUE;
    
    //将偏移添加到 CCR1
    Timer_A Compare_A (timer_A Compare_register)
    
    
    
    
    
    
    
    + COMPARE_UCCR1_COMPARE_1 (timer_COMPARE_COMPARE_INTRY_ER_COMPARE_COUNT_COMPARE_INTRIVATE)+ COMPARE_COMPARE_COMPARE_ER_COMPARE_ER_COMPARE_COUNTLET_COUNTLER_COUNTLE
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > ADC12_A_REPLEASE_SNGLECHANNELDISABLE
    抱歉、我的器件上出现了粘贴错误。 实际上、在我看到错误之前、我已经看过3次了。 我想说:
    >ADC12_A_MULTIPLESAMPLESDISABLE // MSC=0
    您也可以说0。

    我认为您不需要 ADC12_A_SINGLECHANNEL (CONSEQ=0)、因为(根据用户指南(SLAU208Q)图 28-7)您必须在每次转换时将 ENC 切换两次(低电平然后高电平)。 如果 CONSEQ=2且 MSC=0 (图28-9)、则可以避免这种情况。 症状是第一个触发器之后没有触发器。
    ------------------------------
    您还应该向 ISR 中添加:
    > Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1);
    CCR0中断自行清除、但 CCR1没有清除。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    ADC 根本不会被触发。   

    以下快照单步进入代码。  

    initTimer()之后的寄存器视图(在 main 中):

    寄存器视图(如下所示)、因为它首次达到 Timer1_A1_ISR ()。   

    计时器 ISR 末尾的寄存器视图  

    #include "driverlib.h"
    
    //- -#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_of _Samples 32 //喜欢抓取32个样本
    #define COMPARE_VALUE 64000
    
    
    //时钟相关
    #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz
    #define COMPARE_LLRL_BREF_RATION 32.768kHz
    / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compintVal=0;uint32_t MCLK = 0;//mctruint32;/uintuint32_t status/uintuintuint32;/uintuintuintuint32 u/uintuintma-status/t uintuintuintu/uintuintuint32;/uintuintuintuintuintuint
    
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    
    //配置 GPIO 端口/引脚
    initGPIO();
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    initadC();
    
    //启用全局中断
    _bis_SR_register (GIE);
    
    }
    
    
    void initGPIO (void)
    {
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    
    
    //-setup 计时
    器 void initTimers (void)
    {
    
    
    
    //以 SMCLK 为源的连续模式中的启动定时器
    Timer_A_initContinuousModeParam initContParam ={0};
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initContParam.timerClear = timer_a_do _clear;
    initContParam.startTimer = false;
    Timer_A_initContinuousMode (timer_A1_base、&initContParam);
    
    
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (TIMER_A1_base、TIMER_A_CAPTURECOMPARE 寄存器_1);
    
    Timer_A_initCompareModeParam initCompParam ={0};
    initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1;
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE;
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
    initCompParam.compareValue = COMPARE_VALUE;
    Timer_A_initCompareMode (timer_A1_base、&initCompParam);
    
    Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode);
    
    }
    
    
    //-setup 系统时钟
    void initClocks (void)
    {
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void initadc (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持64个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2
    
    
    }
    
    #pragma vector = ADC12_vector
    _ interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    switch (__evo_in_range (ADC12IV、34)){
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    }
    
    
    
    #CAPTMA pragma vector=Timer1_A1_Vector
    __interrupt
    
    void Timer1_A1_ISR (void)
    {
    
    compVal = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_CAPTUREECMPARE 寄存器_1)+ COMPARE_VALUE;
    
    //向 CCR1 Timer_A_setCompareVal 添加偏移量(timer_A
    
    
    + COMPARE_RATION_1
    
    
    
    
    
    
    、Timer_COMPARE_COUNTIMER_COMPARE_COMPARE_COUNT_COUNT_REGENT)
    + COMPARE_COMPARE_COMPARE_COUNTIMER_COMPARE_COMPARE_COUNT_COUNT_COUNT_COUNTRISTER_COMPARE_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNTRISR (COMPARE_COMPARE_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_COUNT_TR
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > ADC12_A_SAMPLEHOLDSOURCE_1、
    > Timer_A_startCounter (timer_A1_base、timer_A_Continuous_mode);
    根据数据表(SLAS700D)、表6-14、SHS=1为 TA0.1、而不是 TA1.1。 我看不到任何与 TA1相关的 SHS 设置。

    您应该在整个过程中使用 TIMER_A0 (及其 CCR1)。 我想我错过了您何时进行该更改。

    未经请求:
    > compVal = Timer_A_getCaptureCompareCount (timer_A1_base、timer_A_CAPTURECMOLE_REGISTER_1)+ COMPARE_VALUE;
    > Timer_A_setCompareValue (timer_A1_base、timer_A_CAPTURECOMPARE 寄存器_1、compVal+COMPARE_VALUE);
    这是双递增的。 这现在不是您的错误、但它最终会出现。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我在之前的帖子中提到了这一点(显示了 TA0连接的表格)。

    无论如何、我已恢复使用 TIMER_A0、并且 ADC 似乎正在触发。

    每4ms 间隔、我希望 ADC ISR 收集32个样本。 如何实现这一点?  

    我知道在连续模式下、溢出将在65536个周期后发生。 因此、如果我将 CCR1设置为64000 (4ms)、这时 ADC ISR 将会触发。

    我对这一点的理解是否正确?

    此致

    脉冲

    #include "driverlib.h"
    
    //- -#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_of _Samples 32 //喜欢抓取32个样本
    #define COMPARE_VALUE 64000
    
    
    //时钟相关
    #define MCLK_REGTED_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz
    #define COMPARE_LLRL_BREF_RATION 32.768kHz
    / FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY (FLL_IN)/ FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREE_FREQUENCY FREE_FREE_FREE_L/ FRE
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    
    void void initADC (void);void initTimers (void);void initClocks (void);void initGPIO (void);//--globals volatile uint16_t data[No_of_samples];// ADC Data volatile uint16_t compintVal=0;uint32_t MCLK = 0;//mctruint32;/uintuint32_t status/uintuintuint32;/uintuintuintuint32 u/uintuintma-status/t uintuintuintu/uintuintuint32;/uintuintuintuintuintuint
    
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    
    //配置 GPIO 端口/引脚
    initGPIO();
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    initadC();
    
    //启用全局中断
    _bis_SR_register (GIE);
    
    while (1)
    {
    
    }
    
    }
    
    
    void initGPIO (void)
    {
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    
    
    //-setup 计时
    器 void initTimers (void)
    {
    
    //以 SMCLK 为源的连续模式中的启动定时器
    Timer_A_initContinuousModeParam initContParam ={0};
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initContParam.timerClear = timer_a_do _clear;
    initContParam.startTimer = false;
    Timer_A_initContinuousMode (timer_A0_BASE、&initContParam);
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1);
    
    Timer_A_initCompareModeParam initCompParam ={0};
    initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1;
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE;
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
    initCompParam.compareValue = COMPARE_VALUE;
    Timer_A_initCompareMode (timer_A0_BASE、&initCompParam);
    Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode);
    }
    
    
    //-setup 系统时钟
    void initClocks (void)
    {
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void initadc (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持64个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2
    
    
    }
    
    #pragma vector = ADC12_vector
    _ interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    switch (__evo_in_range (ADC12IV、34)){
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    }
    
    
    
    #pragma vector=TIMER0_A1_Vector
    __interrupt
    
    void TIMER0_A1_ISR (void)
    {
    
    compVal = Timer_A_getCaptureCompareCount (timer_A0_BASE、timer_A_CAPTUREECMPARE 寄存器_1)+ COMPARE_VALUE;
    
    //将偏移添加到 CCR1 Timer_A_setCompareCount (timer_A1_COMPARE_AM_COMPARE_1
    
    
    
    
    
    
    
    
    
    
    )、Timer_COMPARE_AMT_COUNT_REGIST_COUNTMPARE (timer_COMPARE_COMPARE_AM_COMPARE_AM_COMPARE_1)+ COMPARE_COMPARE_COUNTIMER_COMPARE_COUNT_COUNTRIST_COUNT_COUNT_COUNTRIST_COUNT_COUNTRY_ER_TRIGGER_TRIGGER_TRIGGER_ER_ER
    
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    }
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    >每隔4ms、我希望 ADC ISR 收集32个样本。 如何实现这一点?
    您是指每4ms "节拍"脉冲32次的脉冲(尽快)、还是指每4ms 仅32次采样间隔均匀? 对于后者、我认为您可以将 COMPARE_VALUE 除以32 (=2000)。 前者需要一些思考。
    --------
    未经请求:
    在我看来、由于 LCM (64000、65536)=8192000 /64000=128、因此每128个计算的 CCR1值将为0 (=CCR0)、您将不会得到脉冲(零长度)。 这是一件从现在开始几个月后你会看到的事情。 最简单的修复方法可能是将 CCR0与 CCR1串联、只是几个周期之后:

    > Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1、COMPVal);//新建 CCR1
    #define PULSE_width 10 //任意:小,>0
    > Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_0、COMPVAT+PULSE_WIDTH);//新建 CCR0
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    Bruce、您好、我是指 PWM 信号(通过设置复位模式)、导通时间为4ms、关断时间为4ms。 在4ms 导通时间内、ADC ISR 将获取32个间隔均匀的样本。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    简单来说,答案是否定的 ADC 触发是边沿触发、而不是(高)电平触发。 如果您希望在4ms 内获得32个样本--每125usec 生成1个样本--定时器需要每125usec 生成一个边沿,将其频率从250Hz 更改为8kHz。

    ADC 也不能真正提供自动开/关(例如 ENC=0)的机制、即无需软件干预。

    一种简单的(如果稍微有点偏离)方法是丢弃每一批32个样本。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我在下面找到了一个示例、想知道它是否与我想要的类似。 它通过计时器启用 ADC。





    /*-版权所有-、BSD_EX
    
    *版权所有(c) 2012、德州仪器(TI)公司
    
    *保留所有权利。
    
    *
    
    *
    
    只要
    
    符合以下条件*、允许以源代码和二进制形式重新分发和使用:
    
    *
    
    *源代码的重新分发必须保留上述版权
    
    声明*、此条件列表和以下免责声明。
    
    *
    
    ***二进制形式的再发行必须在
    
    
    
    *随发行提供的文档和/或其他材料中复制上述版权声明、本条件列表和以下免责声明。
    
    *
    
    ***未经
    
    
    
    事先书面许可、不得使用德州仪器公司的名称或*其贡献者的名称认可或推广从本软件衍生的产品*。
    
    *
    
    *本软件由版权所有者和贡献者"按原样"提供
    
    *、
    
    
    
    不承担任何明示或暗示的保证、包括但不限于*适销性和特定用途适用性的暗示保证*。 在任何情况下、版权所有者或
    
    *贡献者都不对任何直接、间接、偶然、特殊、
    
    *模范、 或相应的损害(包括但不限于
    
    *采购替代产品或服务;丧失使用、数据或利润;
    
    *或业务中断)、但出于任何责任理论
    
    、*无论是在合同中、严格责任还是由于
    
    使用本软件而以任何方式产生的侵权行为(包括疏忽或*其他)
    
    、*即使已获悉可能会发生此类损坏。
    
    *
    
    ***
    
    *
    
    * MSP430代码示例免责声明
    
    *
    
    * MSP430代码示例是自包含的低级程序
    
    ,通常*以
    
    高度*简明的方式演示单个外设功能或器件功能。 为此、代码可能依赖于器件的加电默认
    
    值*寄存器值和时钟配置等设置、
    
    并且在组合多个示例中的代码时必须*小心以避免潜在的副作用
    
    *。 另请参阅 www.ti.com/grace 了解 GUI、并参阅 www.ti.com/msp430ware
    
    *了解外设配置的 API 函数库方法。
    
    *
    
    *--/版权--*
    
    //*********
    
    // MSP430G2x33/G2x53演示- ADC10、采样 A7、1.5V、TA1 Trig、超低功耗
    
    //
    
    //说明:A7以1.5V 为基准以1024秒(32xACLK)采样。 所有
    
    //活动由正确使用 MSP430低功耗模式的中断驱动、
    
    //演示了 ADC10和 Vref。 Timer_A 在向上计数模式下同时使用 TA1/TA0来
    
    //驱动 ADC10转换(也可以使用连续模式)。 TA0_ISR
    
    软件的//内部将启用 ADC10和内部基准、
    
    //允许 Vref 在采样开始之前稳定超过30us 的延迟。 每
    
    32个 ACLK 周期 TA1自动触发一次采样//开始。 ADC10_ISR
    
    //将禁用 ADC10和 Vref 并比较 ADC10转换代码。 内部
    
    //振荡器乘以采样(16x)和转换(13x)。 如果 A7 > 0.2Vcc、
    
    // P1.0被置位、否则复位。 正常模式为 LPM3。
    
    ////////* ACLK 需要一个 XOUT 上的外部手表晶振*//
    
    
    
    //// +--- (0.9766us)---- -------------------------------------------------------- >+
    
    // TA0_ISR TA1 ADC10_ISR TA0_ISR TA1
    
    //--- ---------------- ---------------- +--- \---- ---------------- +--- >//
    
    启用 ADC 触发 ADC 禁用 ADC
    
    //和 Vref 比较
    
    // +-(>30US-->+//////
    
    
    
    
    
    // MSP430G2x33/G2x53
    
    // --------
    
    // /|\| XIN|-
    
    // || | 32kHz
    
    // -|RST XOUT|-
    
    // | |
    
    // --|P1.7/A7 P1.0 |--> LED
    
    //
    
    D. Dang
    
    // Texas Instruments Inc.
    
    // 2010年12月
    
    //使用 CCS 版本4.2.0和 IAR 嵌入式工作平台版本构建:5.10
    
    //*********
    
    #include 
    
    
    
    int main (void)
    
    {
    
    WDTCTL = WDTPW + WDTHOLD; //停止 WDT
    
    
    
    ADC10CTL1 = INCH_7 + SHS_1; // P1.7、TA1触发采样启动
    
    ADC10AE0 = 0x80; // P1.7 ADC10选项选择
    
    P1DIR |= 0x01; //将 P1.0设置为输出方向
    
    TACCTL0 = CCIE; //启用中断
    
    TACCR0 = 32-1; // PWM 周期
    
    TACCTL1 = OUTMOD_3; // TACCR1设置/复位
    
    TACCR1 = 2; // TACCR1 PWM 占空比
    
    TACTL = tassel_1 + MC_1; // ACLK、向上计数模式
    
    __bis_SR_register (LPM3_bits + GIE); //输入 LPM3、启用中断
    
    }
    
    
    
    // ADC10中断服务例程
    
    #pragma vector=ADC10_vector
    
    __interrupt void ADC10_ISR (void)
    
    {
    
    ADC10CTL0 &=~ENC; // ADC10禁用
    
    ADC10CTL0 = 0; // ADC10、如果
    
    (ADC10MEM < 0x88)、Vref 完全禁用 // ADC10MEM = A7 > 0.2V?
    
    P1OUT &=~0x01; //清除 P1.0 LED,
    
    否则
    
    P1OUT |= 0x01; //将 P1.0 LED 设置为打开
    
    }
    
    
    
    //计时器 A0中断服务例程
    
    #pragma vector=TIMER0_A1_VECTOR
    
    __interrupt void Timer_A (void)
    
    {
    
    ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
    
    ADC10CTL0 || ENC; // ADC10使能集
    
    }
    
    
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、这是我提到的那种"软件干预"。

    1) 1) ADC ISR 计数到32、然后设置 ENC=0。
    2)定时器 ISR 计数到(2*32)、然后设定 ENC=1。

    您不希望定时器设置 ENC=0、因为此时 ADC 可能正在/可能不会进行主动转换、从而导致 ADC ISR 存在一些模糊性。 [参考用户指南(SLAU208Q)秒 28.2.7.6]

    只要您小心地使计数器保持同步、我认为这应该可以正常工作。

    (自己完成该序列、以确保我不会在某个位置偏离1。)
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我在介绍 SHP、SHSx 和 MSC 交互的论坛上找到了此表。 什么设置与我尝试执行的操作相关?

    我知道、由于我使用脉冲采样模式、SHP = 0。  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您可以通过在调试器中暂停并查看"Registers"窗口来查看设置。 我上次看到您使用的是:
    CONSEQ=2:ADC12_A_REPLED_SINGLECHANNEL
    SHP=1: ADC12_A_setupSamplingTimer()
    SHS=1: ADC12_A_SAMPLEHOLDSOURCE_1、
    MSC=0: ADC12_A_MULTIPLESAMPLESDISABLE
    我想您可以使用 SHP=0并对计时器设置进行适当的更改、但我看不到它会给您带来什么好处。
    ------------------------------
    您昨天的方法是如何运用的? 您的测量结果是否符合您的预期?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    回到昨天的讨论、我仍然对计时器及其 ISR 感到困惑。

    如果您希望在4ms 内获得32个样本--每125usec 生成1个样本--定时器需要每125usec 生成一个边沿,将其频率从250Hz 更改为8kHz。

    >>我将 COMPARE_VALUE 设置为2000 (16MHz/8kHz) 、因此我的 TA0CCR1设置为2000。  那么需要将什么设置为4000? TACCR0?

    我的以下代码已损坏:

    #include "driverlib.h"
    
    //--#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_for_Samples 32 //喜欢抓取32个样本
    
    //如果您希望在4ms 内获得32个样本,即每125usec 1个样本
    //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个)
    //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000
    #define COMPARE_VALUE 2000
    
    
    //与时钟相关
    的#define MCLK_NEXD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU) REVED = 16MHz
    #define FLLREF_kHz //参考频率(FLL)
    #define MCLMK_INTEFAULT/
    
    
    
    void (void);void / INCEFLEVACT-kHz)/TIVACT-TIVACK-FREE (void (void) 32.768
    ;void (f_LMCLK);void / void (void / void (void)
    
    
    
    -globals
    volatile uint16_t data[No_of_samples];// ADC Data
    volatile uint16_t compVal=0;
    
    uint32_t MCLK = 0;//MCLK
    uint32_t smclk = 0;//SMCLK
    uint32_t aclk = 0;//ACLK uint16-
    
    
    
    void (void -main)
    
    
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    
    //配置 GPIO 端口/引脚
    initGPIO();
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    initadC();
    
    //启用全局中断
    _bis_SR_register (GIE);
    
    
    
    }
    
    
    void initGPIO (void)
    {
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    
    
    //-setup 计时
    器 void initTimers (void)
    {
    
    //以 SMCLK 为源的连续模式中的启动定时器
    Timer_A_initContinuousModeParam initContParam ={0};
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initContParam.timerClear = timer_a_do _clear;
    initContParam.startTimer = false;
    Timer_A_initContinuousMode (timer_A0_BASE、&initContParam);
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1);
    
    Timer_A_initCompareModeParam initCompParam ={0};
    initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1;
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE;
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
    initCompParam.compareValue = COMPARE_VALUE;
    Timer_A_initCompareMode (timer_A0_BASE、&initCompParam);
    Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode);
    
    TA0CCR0 = 4000;//ADC 触发
    器}
    
    
    //-setup 系统时钟
    void initClocks(void){
    
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void initadc (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持32个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2
    
    
    }
    
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    开关(__evo_in_range (ADC12IV、34))
    {
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    
    ADC12_A_disableConversions (ADC12_A_base、ADC12_A_COMPLETECONVERSITION);//禁用转换
    }
    
    
    
    #pragma vector=TIMER0_A1_vector
    __interrupt
    
    void TIMER0_A1_ISR (void)
    {
    
    compal = Timer_A_getCaptureCompareCompareTimer = Timer_A
    
    
    
    
    
    
    
    
    
    
    + CORAME_A CORE_A CORET_AMT_PRECT_AMORT_PRISTER (COUNTRIET_AM_AM_COMPARE + COUNTRIEL)、COUNT_COMPARE_RATION_TRIET_COUNTRIEL (COUNT_COMPLET_RATION_TRISTER_COMPAL)+ COMPAREST_COMPALL_COMPALL_COMPALL_COMPAREST_RATE + COMPAREST_RATE + COMPAREST_COUNT_COUNT_RATE + COMPALL_COMPAREST_COUNT_COUNT_COUNT_RATE + COMPAREST_COUNT_RATE COMPAL
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2
    
    }
    
    
    
    #pragma vector=UNMI_vector
    __interrupt void NMI_ISR (void)
    {
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    现在、您的目标似乎是每2次转换运行一次。
    ------
    我在另一天看不到我推荐的代码。 随着采样率的提高、这现在是一项绝对要求。 更新 CMR 应如下所示:
    > Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1、COMPVal);//新建 CCR1
    >#define PULSE_WIDTH 10 //任意:小、>(16MHz/4.2MHz)
    > Timer_A_setCompareValue (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_0、COMPVAT+PULSE_WIDTH);//新建 CCR0
    ------
    4000号是从哪里来的?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    #include "driverlib.h"
    
    //--#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_for_Samples 32 //喜欢抓取32个样本
    
    //如果您希望在4ms 内获得32个样本,即每125usec 1个样本
    //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个)
    //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000
    #define COMPARE_VALUE 2000
    #define PULSE_WIDTH 10 //任意:小、>(16MHz/4.2MHz)
    
    //时钟相关
    #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz、>(16MHz)/FLL_REF_REF_RA比
    /FAIL_REF_REF_REF_kHz
    (32.768kHz)
    
    
    
    
    void initTimers (void);
    void initClocks (void);
    void initGPIO (void);
    
    //--globals
    volatile uint16_t data[No_of_samples];// ADC Data
    volatile uint16_t compVal=0;
    
    uint32_t MCLK = 0;//MCLK
    UCL32_t smclk =
    
    
    
    
    
    
    0;/uintuint32;/t intruint/uintuintu/t status= 0;/t inuint32;/uintuintuintuintuintuint32;/t inuintuint-uintuintuintuintuint
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    
    //配置 GPIO 端口/引脚
    initGPIO();
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    initadC();
    
    //启用全局中断
    _bis_SR_register (GIE);
    
    
    
    }
    
    
    void initGPIO (void)
    {
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    
    
    //-setup 计时
    器 void initTimers (void)
    {
    
    
    //以 SMCLK 为源的连续模式中的启动定时器
    Timer_A_initContinuousModeParam initContParam ={0};
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initContParam.timerClear = timer_a_do _clear;
    initContParam.startTimer = false;
    Timer_A_initContinuousMode (timer_A0_BASE、&initContParam);
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1);
    
    Timer_A_initCompareModeParam initCompParam ={0};
    initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1;
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE;
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
    initCompParam.compareValue = COMPARE_VALUE;
    Timer_A_initCompareMode (timer_A0_BASE、&initCompParam);
    Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode);
    
    }
    
    
    //-setup 系统时钟
    void initClocks (void)
    {
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void initadc (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持32个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2
    
    
    }
    
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    开关(__evo_in_range (ADC12IV、34))
    {
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    
    ADC12_A_disableConversions (ADC12_A_base、ADC12_A_COMPLETECONVERSITION);//禁用转换
    }
    
    
    
    #pragma vector=TIMER0_A1_vector
    __interrupt void
    
    TIMER0_A1_ISR (void)
    {
    
    compVal = Timer_A_getCaptureCompareCompareCompareCompareCompareTimer=TIMER0_A + COMPARE_RATE (COMPARE_COMPARE_1)
    
    + COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COUNTER_RATION_COMPARE_RATE (COMP //新 CCR1
    
    Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREMPARE 寄存器_0、compVal + PULSE_width);//新 CCR0
    
    Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1);
    
    //开始单次转换或无重复序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2
    
    }
    
    
    
    #pragma vector=UNMI_vector
    __interrupt void NMI_ISR (void)
    {
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    } 

    您好、Bruce、

    好的、我也做了这些更改。 似乎我得到一个 ADC 计数、然后在 ADC ISR 禁用后转换被禁用。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    TA0CCR1 = 4000

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > TA0CCR1 = 4000
    您在2000 (COMPARE_VALUE)启动它、然后将2000 (COMPARE_VALUE)添加到它。

    您是否说过、在第一个转换之后、您永远不会得到任何转换? 如果您暂停、您的程序在哪里执行?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、  

    我得到一个转换。 暂停执行时、它在 ADC12_A_disableConversions 内。  

    到目前为止我的代码:  

    #include "driverlib.h"
    
    //--#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_for_Samples 32 //喜欢抓取32个样本
    
    //如果您希望在4ms 内获得32个样本,即每125usec 1个样本
    //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个)
    //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000
    #define COMPARE_VALUE 2000
    #define PULSE_WIDTH 10 //任意:小、>(16MHz/4.2MHz)
    
    //时钟相关
    #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz、>(16MHz)/FLL_REF_REF_RA比
    /FAIL_REF_REF_REF_kHz
    (32.768kHz)
    
    
    
    
    void initTimers (void);
    void initClocks (void);
    void initGPIO (void);
    
    //--globals
    volatile uint16_t data[No_of_samples];// ADC Data
    volatile uint16_t compVal=0;
    
    uint32_t MCLK = 0;//MCLK
    UCL32_t smclk =
    
    
    
    
    
    
    0;/uintuint32;/t intruint/uintuintu/t status= 0;/t inuint32;/uintuintuintuintuintuint32;/t inuintuint-uintuintuintuintuint
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    
    //配置 GPIO 端口/引脚
    initGPIO();
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    initadC();
    
    //启用全局中断
    _bis_SR_register (GIE);
    
    
    
    }
    
    
    void initGPIO (void)
    {
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    
    
    //-setup 计时
    器 void initTimers (void)
    {
    
    
    //以 SMCLK 为源的连续模式中的启动定时器
    Timer_A_initContinuousModeParam initContParam ={0};
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initContParam.timerClear = timer_a_do _clear;
    initContParam.startTimer = false;
    Timer_A_initContinuousMode (timer_A0_BASE、&initContParam);
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1);
    
    Timer_A_initCompareModeParam initCompParam ={0};
    initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1;
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE;
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
    initCompParam.compareValue = COMPARE_VALUE;
    Timer_A_initCompareMode (timer_A0_BASE、&initCompParam);
    Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode);
    
    }
    
    
    //-setup 系统时钟
    void initClocks (void)
    {
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void initadc (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持32个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    // ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2
    
    
    }
    
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    开关(__evo_in_range (ADC12IV、34))
    {
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    
    ADC12_A_disableConversions (ADC12_A_base、ADC12_A_COMPLETECONVERSITION);//禁用转换
    }
    
    
    
    #pragma vector=TIMER0_A1_vector
    __interrupt void
    
    TIMER0_A1_ISR (void)
    {
    
    compVal = Timer_A_getCaptureCompareCompareCompareCompareCompareTimer=TIMER0_A + COMPARE_RATE (COMPARE_COMPARE_1)
    
    + COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COMPARE_COUNTER_RATE (COMPARE_COMPARE_RATE)+ COMPARE_COUNTER_RATION_COMPARE_RATE (COMP //新 CCR1
    
    Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREMPARE 寄存器_0、compVal + PULSE_width);//新 CCR0
    
    Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1);
    
    //开始单次转换或无重复序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2
    
    }
    
    
    
    #pragma vector=UNMI_vector
    __interrupt void NMI_ISR (void)
    {
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    } 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    该测试(在"如果"中)向后看;它似乎与用户指南(SLAU208P)第28.2.7.6节不匹配。 可能我读错了?

    在任何情况下:请尝试将 DisableConversions 调用替换为"ADC12CTL0 &=~ADC12ENC;"、因为这是您真正想要的。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    ADC12ENC 位的寄存器级切换不再挂起、因此将继续保持挂起。  

    当我在计时器 ISR 内的开始转换时设置断点时,我会看到以下内容:

    开始:TA0CCR0 = 4010,TA0CCR1 = 4000,TA0R=2110

    第一次转换:TA0CCR1 = 10000、TA0CCR0 = 10010、TA0R = 8110

    第二次转换:TA0CCR1 = 12000、TA0CCR0 = 12010、TA0R = 10110

    等等。

    我的代码如下:

    #include "driverlib.h"
    
    //--#define
    #define ADCpin GPIO_PORT_P6、GPIO_PIN0 //端口6引脚0
    #define No_for_Samples 32 //喜欢抓取32个样本
    
    //如果您希望在4ms 内获得32个样本,即每125usec 1个样本
    //计时器需要每125usec 生成一个边沿=8kHz/t = 8kHz (1个)
    //比较值= SMCLK/8kHz =(16MHz/8kHz)= 2000
    #define COMPARE_VALUE 2000
    #define PULSE_WIDTH 10 //任意:小、>(16MHz/4.2MHz)
    
    //时钟相关
    #define MCLK_REFOD_FREQUENCY IN_kHz 16000 // MCLK 主时钟(CPU)= 16MHz、>(16MHz)/FLL_REF_REF_RA比
    /FAIL_REF_REF_REF_kHz
    (32.768kHz)
    
    
    
    
    void initTimers (void);
    void initClocks (void);
    void initGPIO (void);
    
    //--globals
    volatile uint16_t data[No_of_samples];// ADC Data
    volatile uint16_t compVal=0;
    
    uint32_t MCLK = 0;//MCLK
    UCL32_t smclk =
    
    
    
    
    
    
    0;/uintuint32;/t intruint/uintuintu/t status= 0;/t inuint32;/uintuintuintuintuintuint32;/t inuintuint-uintuintuintuintuint
    
    //停止看门狗计时器
    WDT_A_HOLD (WDT_A_base);
    
    
    //配置 GPIO 端口/引脚
    initGPIO();
    
    //设置时钟
    initClocks();
    
    //验证时钟设置是否符合预期
    MCLK = UCS_getMCLK ();
    aclk = UCS_getACLK ();
    smclk = UCS_getSMCLK ();
    
    //计时器设置
    initTimer();
    
    //ADC 设置
    initadC();
    
    while (1)
    {
    //启用全局中断
    _bis_SR_register (GIE);
    }
    
    
    
    }
    
    
    void initGPIO (void)
    {
    //将 P1.0设置为输出
    GPIO_setAsOutputPin (GPIO_PORT_P1、GPIO_PIN0);
    }
    
    
    
    //-setup 计时
    器 void initTimers (void)
    {
    
    
    //以 SMCLK 为源的连续模式中的启动定时器
    Timer_A_initContinuousModeParam initContParam ={0};
    initContParam.clockSource = TIMER_A_CLOCKSOURCE_SMCLK;
    initContParam.clockSourceDivider = TIMER_A_CLOCKSOURCE_divider;
    initContParam.timerInterruptEnable_TAIE = TIMER_A_TAIE_INTERRUPT_DISABLE;
    initContParam.timerClear = timer_a_do _clear;
    initContParam.startTimer = false;
    Timer_A_initContinuousMode (timer_A0_BASE、&initContParam);
    
    //初始化比较模式
    Timer_A_clearCaptureCompareInterrupt (TIMER_A0_BASE、TIMER_A_CAPTURECOMPARE 寄存器_1);
    
    Timer_A_initCompareModeParam initCompParam ={0};
    initCompParam.compareRegister = TIMER_A_CAPTURECMPARE 寄存器_1;
    initCompParam.compareInterruptEnable = TIMER_A_CAPTURECMPARE INTERRUPT_ENABLE;
    initCompParam.compareOutputMode = TIMER_A_OUTPUTMODE_SET_RESET;
    initCompParam.compareValue = COMPARE_VALUE;
    Timer_A_initCompareMode (timer_A0_BASE、&initCompParam);
    Timer_A_startCounter (timer_A0_BASE、timer_A_Continuous_mode);
    
    }
    
    
    //-setup 系统时钟
    void initClocks (void)
    {
    
    //设置 DCO FLL 基准= REFO
    UCS_initClockSignal (
    UCS_FLLREF、 频率锁定环路的//基准
    UCS_REFOCLK_SELECT、//选择32.768kHz 基准振荡器
    UCS 时钟分频器1
    );
    
    //设置 ACLK = REFO 设置辅助时钟
    UCS_initClockSignal (
    UCS_ACLK、
    UCS_REFOCLK_SELECT、
    UCS 时钟分频器1
    );
    
    //启动 FLL 并让其稳定下来
    //这将自动成为 MCLK 和 SMCLK
    //设置所需的频率并加载比率
    UCS_initFLSettle (
    MCLK_REVed_frequency in_kHz、
    MCLK_FLLREF_Ratio
    );
    
    //启用全局振荡器故障标志
    SFR_clearInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    SFR_enableInterrupt (
    SFR_Oscillator_FAULT_INTERRUPT
    );
    
    }
    
    //--setup ADC
    void initadc (void)
    {
    
    //设置 ADC 引脚
    GPIO_setPeripheralModuleFunctionInputPin (ADCpin);
    
    //初始化 ADC12_A 模块
    /* ADC12_A 模块的基地址
    *使用内部 ADC12_A 位作为采样/保持信号来启动转换
    *使用 ADC12OSC 5MHZ 内部数字振荡器作为时钟源
    *使用默认的时钟分频器1
    *
    ADC12_A_init (
    ADC12_A_base、
    ADC12_A_SAMPLEHOLDSOURCE_1、
    ADC12_A_CLOCKSOURCE_ADC12OSC、
    ADC12_A_CLOCKDIVIDER_1
    );
    
    ADC12_A_ENABLE (ADC12_A_base);
    
    //将采样计时器设置为采样保持32个时钟周期
    /* ADC12_A 模块的基地址
    *对于内存缓冲区0-7采样/保持、持续64个时钟周期
    *对于内存缓冲区8-15个采样/保持、持续64个时钟周期
    *禁用多路采样
    *
    ADC12_A_setupSamplingTimer()
    ADC12_A_base、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_CYCLEHOLD_32_CYCLES、
    ADC12_A_MULTIPLESAMPLESDISABLE
    );
    
    
    //使用指定的基准电压配置存储器缓冲器
    /* ADC12_A 模块的基地址
    *配置内存缓冲区0
    *将输入 A12映射到存储器缓冲器0
    * VREF+= VREF+(内部)
    * Vref-= AVSS
    *内存缓冲区0不是序列的末尾
    *
    ADC12_A_configureMemoryParam param ={0};
    param.memoryBufferControlIndex |= ADC12_a_memory_0;
    param.inputSourceSelect |= ADC12_A_INPUT_A0;
    param.positiveRefVoltageSourceSelect |= ADC12_A_VREFPOS_AVCC;
    param.inveRefVoltageSourceSelect |= ADC12_A_VREFNEG_AVSS;
    param.endOfSequence |= ADC12_A_NOTENDOSEQUENCE;
    ADC12_A_configureMemory (ADC12_A_base、&param);
    
    //启用存储器缓冲器0中断
    ADC12_A_clearInterrupt (ADC12_A_base、ADC12IE0);
    ADC12_A_enableInterrupt (ADC12_A_base、ADC12IE0);
    
    //开始单次转换,无重复或序列。
    //ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_REPEATE_SINGLECHANNEL);// conseq = 2
    
    
    }
    
    #pragma vector = ADC12_vector
    __interrupt void ADC12_ISR (void)
    {
    
    静态 uint8_t 索引= 0;
    
    开关(__evo_in_range (ADC12IV、34))
    {
    情况0:中断;//Vector 0:无中断
    情况2:中断;//Vector 2:ADC 溢出
    情况4:中断;//矢量4:ADC 时序溢出
    案例6: //向量6:ADC12IFG0
    //移动结果
    DATA[index]= ADC12_A_getResults (ADC12_A_base、ADC12_A_MEMORY_0);
    
    //递增结果索引,模数;
    //set Breakpoint1此处并观察结果[]
    索引++;
    
    如果(索引==32)
    {
    索引= 0;
    // ADC12_A_disableConversions (ADC12_A_base、ADC12_A_PREEMPTCONVERSITION);//禁用转换
    ADC12CTL0 &=~ADC12ENC;
    
    
    
    }
    情况8:中断;//Vector 8:ADC12IFG1
    情况10:中断;//Vector 10:ADC12IFG2
    情况12:中断;//向量12:ADC12IFG3
    案例14:中断;//Vector 14:ADC12IFG4
    情况16:中断;//向量16:ADC12IFG5
    情况18:中断;//Vector 18:ADC12IFG6
    情况20:中断;//Vector 20:ADC12IFG7
    情况22:中断;//Vector 22:ADC12IFG8
    情况24:中断;//Vector 24:ADC12IFG9
    情况26:中断;//Vector 26:ADC12IFG10
    情况28:中断;//Vector 28:ADC12IFG11
    情况30:中断;//Vector 30:ADC12IFG12
    情况32:中断;//Vector 32:ADC12IFG13
    案例34:中断;//Vector 34:ADC12IFG14
    默认值:break;
    }
    
    }
    
    
    
    #pragma vector=TIMER0_A1_Vector
    __interrupt
    
    void TIMER0_A1_ISR (void)
    {
    
    compVal = Timer_A_getCaptureCompareCount (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1)+ COMPARE_VALUE;
    
    Timer_A_setCompareVal (timer_A0_BASE、COMPARE_1);COMPARE_COMPARE_COMPARE_COMPARE_1;Timer_COMPARE_COMPARE_COMPARE_COMPARE_1;COMPARE_COMPARE_COMPAR //新 CCR1
    
    Timer_A_setCompareValue (timer_A0_BASE、timer_A_CAPTUREMPARE 寄存器_0、compVal + PULSE_width);//新 CCR0
    
    Timer_A_clearCaptureCompareInterrupt (timer_A0_BASE、timer_A_CAPTURECOMPARE 寄存器_1);
    
    //开始单次转换或无重复序列。
    ADC12_A_startConversion (ADC12_A_base、ADC12_A_MEMORY_0、ADC12_A_RESPOND_SINGLECHANNEL);// conseq = 2
    
    // ADC12CTL0 |= ADC12ENC;
    
    }
    
    
    
    #pragma vector=UNMI_Vector
    _ interrupt
    (nid)
    执行{
    //如果在超时后仍然无法清除振荡器故障标志,
    //在此处捕获并等待。
    状态= UCS_clearAllOscFlagsWithTimeout (1000);
    } while (status!= 0);
    }
    

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    它看起来有一个计时器启动功能、也许是因为您启动它的时间有点早、并且您最初并不设置 CCR0。 我认为这一点可以在某个时候得到解决。

    请记住、您标记的"首次转换"(等)不是转换、而是启用。 (startConversion 调用可替换为设置 ENC=1、如您的注释所示。) 启用在触发脉冲之后进行设置、以便 ROUND 可能会也可能不会导致实际转换。

    您现在已经在 ADC ISR 中实现了建议的32位计数、但在计时器中没有实现计数到(2 * 32)。 我预期的效果是、您将执行32次转换、然后跳过一次转换(计时器 ISR 中的计数到1)、然后再次开始。 您的想法是这样吗? 这不是您最初描述的那样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Bruce、

    我之后的所有样本都是在4ms 周期内32个均匀间隔的样本。

    当系统时钟为16MHz 和8kHz 采样率时、我们已将 ADC 触发速率设置为每125us 一次(TA0CCR1 = 2000)。 我一直理解到这里、但我不确定我们将使用64位计数 器的方法是什么。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您已经描述了一个(2*32)=64触发器的周期。 前32位实际上会触发 ADC。 然后、ADC ISR 禁用触发(ENC=0)。 脉冲持续发生、但 ADC 忽略它们;它们不会导致调用 ADC ISR。 您希望继续忽略接下来的32个脉冲。

    定时器 ISR 会看到所有64个脉冲事件。 如果它计数到最多32个(32个转换)、然后计数到最多64个(32个被忽略的脉冲)、然后启用触发(ENC=1)、ADC 将在下一个脉冲上触发、并且周期重新开始。

    唯一的细微细微差别是在脉冲发生后调用计时器 ISR、因此您可能必须在 count = 63时设置 ENC=1 (但仍计数到64)以避免发生"off-by"。 我建议您将其绘制在一张纸或白板上、以便您了解其工作原理。 (尝试使用假设 N=3而不是 N=32的方法。) 我们只讨论几行代码、但我认为绘制它将帮助您查看动态。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    Pulin

    我认为 Bruce 的建议帮助您得出了有关此主题的结论、因为您已经不再回复此话题了。

    请注意、我将关闭此主题。 请验证帮助您推进项目的给定答案、以便其他用户也能从中受益。

    如果您需要有关此主题的进一步帮助、请随时回复。 对于新问题或相关问题、请考虑按下页面顶部的"提出新问题"或"提出相关问题"按钮。

    此致、

    Britta

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Britta、

    由于其他项目 优先事项、我没有机会尝试他的最新建议 、否则我会发布我的回复。

    如果您决定 锁定该主题, 我是否 单击“提出相关问题”? 要重新激活对话框?

    此致

    脉冲  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好、Pulin、

    是的、我认为这是最好的方法。 我将关闭此主题、在您尝试了最新建议后、您有一个后续问题、您可以使用"提出相关问题"按钮。 生成一个新线程、以帮助您向前发展。

    此致、
    Britta