ZHCAER6A August   2024  – August 2025 MSPM0C1105 , MSPM0C1106 , MSPM0G1105 , MSPM0G1106 , MSPM0G1107 , MSPM0G1505 , MSPM0G1506 , MSPM0G1507 , MSPM0G3105 , MSPM0G3106 , MSPM0G3107 , MSPM0G3505 , MSPM0G3506 , MSPM0G3507 , MSPM0L1105 , MSPM0L1106 , MSPM0L1303 , MSPM0L1304 , MSPM0L1304-Q1 , MSPM0L1305 , MSPM0L1305-Q1 , MSPM0L1306 , MSPM0L1306-Q1 , MSPM0L1343 , MSPM0L1344 , MSPM0L1345 , MSPM0L1346

 

  1.   1
  2.   2
  3.   商标
  4.   修订历史记录

说明

此示例演示了如何将模拟信号转换为 4kHz PWM 输出。使用 MSPM0 集成式 ADC 对模拟输入信号进行采样。PWM 输出的占空比根据 ADC 读数进行更新。本示例需要两个计时器;一个用于触发 ADC 读取,另一个用于生成 PWM 输出。下载此示例的代码。

图 1-1 显示了该示例中使用的外设的功能方框图。

 子系统功能方框图图 1-1 子系统功能方框图

所需外设

此应用需要 2 个计时器、1 个集成 ADC 和 2 个器件引脚。

表 1-1 外设要求

子块功能

外设

用法

注释

采样触发

(1x)

计时器 G

在代码中称为 TIMER_0_INST

PWM 生成

(1 个)计时器 G

在代码中称为 PWM_0_INST

模拟信号捕获

1 个 ADC 通道

在代码中称为 ADC12_0_INST

IO

2 引脚

(1x) ADC 输入 (1x) PWM 输出

设计步骤

  1. 确定所需的 PWM 输出频率和分辨率。在计算其他设计参数时,以这两个参数为起点。在该示例中,我们选择了 4kHz 的 PWM 输出频率和 10 位的 PWM 分辨率。
  2. 计算计时器时钟频率。公式 F_clock = F_pwm x 分辨率可用于计算计时器时钟频率。
  3. 确定 ADC 采样率。采样率与输出 PWM 频率相关。在该示例中,单个 ADC 样本确定占空比。F_adc = F_pwm。然而,滤波或平均值计算可能要求应用选择不同的采样率。
  4. SysConfig 中配置外设。选择将使用的计时器实例。配置将用于 ADC 输入和 PWM 输出的器件引脚。该示例将 PA17 用于 PWM 输出(连接到计时器 G4),将 A0.4 用于模拟输入。
  5. 编写应用程序代码。该应用的剩余部分是将 ADC 样本传输到 PWM 计时器。这是在软件中实现的。请参阅“软件流程图”以了解应用程序概况或直接浏览代码。

设计注意事项

  1. 最大输出频率:从根本上说,最大 PWM 输出频率受 IO 速度的限制。不过,占空比分辨率也会影响最大输出频率。更高的分辨率需要更多的计时器计数,从而增加输出周期。
  2. 时钟:确定使用哪些时钟以及使用哪些时钟分频比是该应用的重要设计注意事项。
    1. 选择 2 的幂作为分辨率,以便缩放运算可以使用移位而不是乘以和除以 b.
    2. 通常,不要将较慢的时钟分频到较低的频率,而是选择较慢的时钟以降低功耗 3.
  3. gCheckADC 上的竞态条件:该应用会尽快清除 gCheckADC。如果应用等待清除 gCheckADC 的时间过长,则可能会无意中丢失新数据。
  4. 流水线:该应用中选择的 PWM 计时器支持计时器比较值流水线。流水线使应用能够计划计时器比较值更新,而不会对输出产生干扰。在不支持流水线的情况下,有一些技术可以缓解计时器上的干扰。但这超出了本文档的讨论范围。

软件流程图

图 1-2 展示了应用将 ADC 读数转换为 PWM 输出所执行的操作。

 应用软件流程图图 1-2 应用软件流程图

应用代码

此应用的 PWM 输出具有 10 位分辨率。不过,ADC 样本是 12 位,因此我们必须将 12 位 ADC 读数转换为 10 位值,以便设置 PWM 计时器的比较值。根据应用要求,可能需要不同的调节。

此外,可能需要对传入数据进行更先进的信号处理。例如,限制、平均值或其他滤波在不同情况下可能很重要。可以在以下函数中执行这些类型的操作。

void updatePWMfromADCvalue(uint16_t adcValue) {
    // Check to see if the adc value is above our minimum threshold
    if (adcValue > PWM_DEADBAND)
    {
       // Convert 12bit adcValue into 10bit value by right
       // shifting by 2 because the PWM resolution is 10bit
       uint16_t adcValue_10bit = adcValue >> 2;
       // PWM timer is configured as a down counter (i.e it 
       // starts   counting down from PWM_LOAD_VAL) and its 
       // initial state is high therefore we must perform 
       // the following operation so that small values of 
       // adcValue_10bit result in small duty cycles 
       uint16_t ccv = PWM_LOAD_VAL - adcValue_10bit; 
       // Write the new ccv value into the corresponding timer 
       // register 
       DL_TimerG_setCaptureCompareValue(PWM_0_INST, 
                                        ccv, 
                                        DL_TIMER_CC_0_INDEX); 
       // Start the timer if it is not already running 
       if ( !DL_TimerG_isRunning(PWM_0_INST) ) {  
           DL_TimerG_startCounter(PWM_0_INST); 
       } 
    } 
    else { 
        // If adcResult is not above deadband value then disable timer   
        DL_TimerG_stopCounter(PWM_0_INST); 
    }
}

结果

 当 ADC 输入低于死区时,禁用 PWM 输出图 1-3 当 ADC 输入低于死区时,禁用 PWM 输出.

当输入电压低于预设的死区值时,输出被禁用,如图 1-3 所示。

 PWM 输出占空比对应于输入电压图 1-4 PWM 输出占空比对应于输入电压.

在图 1-4 中,输入电压为 2.26V。测得的占空比为 67.93%。快速计算确认预期占空比为 68.4%。