主题中讨论的其他器件:BOOSTXL-AUDIO、 SysConfig
您好!
此处提供了分步指南、展示了如何使用 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-结果:
我希望这将有所帮助、
此致、