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.

[FAQ] [参考译文] [常见问题解答] CC2340R5:生成警报的 PWM 示例

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

https://e2e.ti.com/support/wireless-connectivity/bluetooth-group/bluetooth/f/bluetooth-forum/1264576/faq-cc2340r5-pwm-example-to-produce-a-siren

器件型号:CC2340R5
主题中讨论的其他器件:BOOSTXL-AUDIOSysConfig

您好!

此处提供了分步指南、展示了如何使用 PWM 示例生成类似警报的声音。

该示例基于 F3 SDK 7.20.00.29。

BOOSTXL-AUDIO 用于将 PWM 转换成声音(也可以考虑使用其他硬件)。

1-通过将此 zip 文件的内容复制粘贴到 SDK 安装中来应用 PWM 补丁(仅适用于 SDK 7.20.00.29) /cfs-file/__key/communityserver-discussions-components-files/538/7532.pwm_5F00_patch.zip

如果尚未完成、请打开 CCS、创建一个工作区并将其配置为使用 FreeRTOS。

3 -从 SDK 导入空项目。 为了保持完整性、生成一次项目。

4 -在项目中复制文件 PWM.c、PWM.h、PWMTimerLPF3.c、PWMTimerLPF3.h。 这些文件位于您要保存到 \source\ti\drivers。

5-在 SysConfig 中配置 PWM 驱动程序。 请注意、我们启用 PWM 信号及其互补通道(即使此处未使用)。


完成后、保存并关闭 SysConfig。

修改代码以使用 PWM 驱动程序。 我主要使用了 pwm.h 中提供的代码片段。
所有更改都在 empty.c 文件中进行(内容应用于替换 empty.c 的内容)

/*
 *  ======== empty.c ========
 */

/* For usleep() */
#include <unistd.h>
#include <stdint.h>
#include <stddef.h>

/* Driver Header files */
#include <ti/drivers/GPIO.h>
#include <ti/drivers/PWM.h>

/* Driver configuration */
#include "ti_drivers_config.h"

/*
 *  ======== mainThread ========
 */
void *mainThread(void *arg0)
{
    /* 10 ms delay */
    uint32_t time = 10000; //us

    const uint32_t PWM_PERIOD_MIN = 1000; //1kHz
    const uint32_t PWM_PERIOD_MAX = 8000; //8kHz
    const uint32_t PWM_PERIOD_STEP = 10; //10Hz

    int pwmIncrement = PWM_PERIOD_STEP;
    uint32_t pwmPeriodValue = PWM_PERIOD_MIN;

    /* Call driver init functions */
    GPIO_init();

    /* Configure the LED pin */
    GPIO_setConfig(CONFIG_GPIO_LED_0, GPIO_CFG_OUT_STD | GPIO_CFG_OUT_LOW);

    /* Turn on user LED */
    GPIO_write(CONFIG_GPIO_LED_0, CONFIG_GPIO_LED_ON);

    PWM_Handle pwm;
    PWM_Params pwmParams;

    PWM_init();

    PWM_Params_init(&pwmParams);
    pwmParams.idleLevel = PWM_IDLE_LOW;
    pwmParams.periodUnits = PWM_PERIOD_HZ;
    pwmParams.periodValue = 1000;
    pwmParams.dutyUnits = PWM_DUTY_FRACTION;
    pwmParams.dutyValue = (uint32_t) (((uint64_t) PWM_DUTY_FRACTION_MAX * 50) / 100); // 50% duty cycle

    pwm = PWM_open(CONFIG_PWM_0, &pwmParams);

    PWM_start(pwm);

    if (pwm == NULL) {
        // PWM_open() failed
        while (1);
    }

    while (1)
    {
        usleep(time);
        GPIO_toggle(CONFIG_GPIO_LED_0);

        pwmPeriodValue += pwmIncrement;

        if(pwmPeriodValue < PWM_PERIOD_MIN)
        {
            pwmIncrement = PWM_PERIOD_STEP;
            pwmPeriodValue += pwmIncrement;
        }
        else if(pwmPeriodValue > PWM_PERIOD_MAX)
        {
            pwmIncrement = -PWM_PERIOD_STEP;
            pwmPeriodValue += pwmIncrement;
        }

        PWM_setPeriod(pwm, pwmPeriodValue);
    }
}

7-构建并运行代码

8-结果:

我希望这将有所帮助、

此致、

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

    您好、Clement、

    感谢您的分享!!

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

    尊敬的

    非常感谢您在另一个主题上发布此内容、因此我收到了通知、以及我修改后的示例、非常感谢! 你是一个非常有趣的想法,保持一切简单,太糟糕我没有音频 BP ,我甚至不知道它存在. 我尚未开始移植到 PWM 驱动程序(尽管我已经有一些初步的发现、比如实现与其他 SimpleLink 驱动程序不同、或者可能只是 SysConfig 1.17.0 问题、因此我已从其中排除驱动程序配置文件并对其进行操作。 因为我还需要首先整理一些30μs 计时器的复杂性、就像我的应用框架需要一些严格的(<RTOS)计时/中断、并且我必须在硬件中完成它们、因为提高 FreeRTOS 周期频率会导致过多开销。 我必须测试与 BLE Stack 的交互、并且驱动程序与我之前建模的驱动程序不同(仍然是 SimpleLink/FreeRTOS、但在 MSP432上、不同的外设模块、不同的实现和不同的内核)。 然而、这是 OT、我将在单独的主题中分享我的问题并提出问题。

    此致、

    斯特凡诺

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

    忘了问,因为这是一个有趣的例子,为什么不张贴一个简短的视频与声音,所以像我们这样的穷人没有无限的访问异国情调的 BPS 可以享受:-)?