基于纳芯微评估板实现EPWM设计
该项目使用了纳芯微评估板,实现了EPWM设计的设计,它的主要功能为:通过十二指神探进行对开发板 IO8、IO9占空比50%,波形频率2MHz的功能的实现,并把采集的数据用Pulseview软件进行显示。
标签
嵌入式系统
开发板
PWM
传感器
meiyao
更新2025-12-02
54

1、任务介绍

基于NS800RT5039开发板实现Uart串口输出,“Hello, NOVOSENSE Wedesign project.” 和、 ePWM外设通过十二指神探采集实现EPWM采集;


2、项目描述

项目基于NS800RT5039开发板,围绕串口通信与ePWM外设采集功能展开设计。

硬件层面,利用开发板内置的UART,通过TX/RX引脚连接PC串口调试助手进行通信显示,实现数据透传;

同时,借助其高精度ePWM外设生成可调占空比的脉冲信号,并利用十二指神探对ePWM输出进行上下时序实时采集与反馈。

软件部分,编写UART驱动代码,初始化波特率、数据位等参数,发送字符串Hello, NOVOSENSE Wedesign project至终端;

针对ePWM采集,配置定时器触发,通过算法计算实际占空比并与设定值对比,实现闭环校准并通过 十指的采集显示在PC端。



3、硬件介绍

NS800RT5039开发板功能实现

1. UART串口输出

功能目标:通过UART接口输出字符串 "Hello, NOVOSENSE Wedesign project.",并在串口助手上实时显示。

硬件配置:

USART外设:选择开发板上的USART,具体引脚需参考开发板手册,USART默认使用PA29/PA28。

通信参数:波特率设置为 115200,数据位8位,无校验位,停止位1位。

连接方式:开发板的TX引脚PA29连接至USB转TTL模块的RX端,通过串口助手查看输出。


实现步骤:

初始化USART外设:配置时钟、引脚复用功能、通信参数。

发送字符串:通过USART的发送函数将字符串逐字节发送。

调试验证:使用示波器或逻辑分析仪检查TX引脚信号,或直接观察串口助手输出。

关键点:

确保开发板与串口助手的波特率一致,避免乱码。

若开发板未提供默认USART引脚,需根据原理图手动配置GPIO复用功能。


2. ePWM采集(通过十二指神探D5/D6)

功能目标:使用开发板的 IO8 和 IO9, 采集十二指神探的 D5/D6 引脚输入采集PWM信号,计算频率和占空比。

硬件配置:

信号连接:十二指神探的D5,PWM输入连接至IO8,D6连接至IO9,PWM输入

外设选择:使用 TIM1 的输入捕获模式,配置为上升沿触发中断。

时钟配置:根据PWM信号频率范围,设置合适的预分频系数系统时钟分频至2MHz。


实现步骤:

配置TIM1输入捕获:

设置TIM1为向上计数模式,最大计数值。

配置通道为输入捕获模式,触发边沿为上下升沿。

中断处理:

在通道1捕获中断中记录当前计数值。

在通道2捕获中断中记录计数值,并计算周期和占空比.


调试验证:

使用逻辑分析仪或示波器验证IO8,IO9通过十二指的D5/D6输入的PWM信号是否正常。

检查计算结果是否与实际信号一致,频率误差是否在合理范围内。


4、了解开发板

开发板整体布局

image.png

5、方案框图

image.png

6、原理图

image.png

硬件连接示意图

image.png

连接实物图

image.png


7、代码

  
/* ePWM5A通道引脚配置 → GPIO8 */
GPIO_setAnalogMode(myEPWM5_EPWMA_GPIO, GPIO_ANALOG_DISABLED); // 禁用模拟功能,配置为数字引脚
GPIO_setPinConfig(myEPWM5_EPWMA_PIN_CONFIG); // 设置引脚功能为ePWM5A输出
GPIO_setPadConfig(myEPWM5_EPWMA_GPIO, GPIO_PIN_TYPE_STD); // 配置为标准推挽输出模式
GPIO_setQualificationMode(myEPWM5_EPWMA_GPIO, GPIO_QUAL_SYNC); // 设置输入同步滤波(防止毛刺)

/* ePWM5B通道引脚配置 → GPIO9 */
GPIO_setAnalogMode(myEPWM5_EPWMB_GPIO, GPIO_ANALOG_DISABLED); // 禁用模拟功能,配置为数字引脚
GPIO_setPinConfig(myEPWM5_EPWMB_PIN_CONFIG); // 设置引脚功能为ePWM5B输出
GPIO_setPadConfig(myEPWM5_EPWMB_GPIO, GPIO_PIN_TYPE_STD); // 配置为标准推挽输出模式
GPIO_setQualificationMode(myEPWM5_EPWMB_GPIO, GPIO_QUAL_SYNC); // 设置输入同步滤波(防止毛刺)


/* 时钟配置 - 1:1分频 */
EPWM_setClockPrescaler(myEPWM5_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);

/* 时基配置 - 产生2MHz PWM频率 (系统时钟260MHz) */
EPWM_setTimeBasePeriod(myEPWM5_BASE, 65); // 周期值 = 65 → 260MHz/(65 * 2) = 2MHz
EPWM_setTimeBaseCounter(myEPWM5_BASE, 0); // 计数器初始值清零
EPWM_setTimeBaseCounterMode(myEPWM5_BASE, EPWM_COUNTER_MODE_UP_DOWN); // 上下计数模式
EPWM_disablePhaseShiftLoad(myEPWM5_BASE); // 禁用相位偏移加载
EPWM_setPhaseShift(myEPWM5_BASE, 0); // 相位偏移设为0

/* 比较器配置 - 50%占空比 */
EPWM_setCounterCompareValue(myEPWM5_BASE, EPWM_COUNTER_COMPARE_A, 32); // CMPA = 32 (50%)
EPWM_setCounterCompareShadowLoadMode(myEPWM5_BASE, EPWM_COUNTER_COMPARE_A,
EPWM_COMP_LOAD_ON_CNTR_ZERO); // 零点重载
EPWM_setCounterCompareValue(myEPWM5_BASE, EPWM_COUNTER_COMPARE_B, 32); // CMPB = 32 (50%)
EPWM_setCounterCompareShadowLoadMode(myEPWM5_BASE, EPWM_COUNTER_COMPARE_B,
EPWM_COMP_LOAD_ON_CNTR_ZERO); // 零点重载

/* 动作限定器配置 - A通道PWM波形生成 */
EPWM_setActionQualifierAction(myEPWM5_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); // 零点输出低
EPWM_setActionQualifierAction(myEPWM5_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA); // 上升过CMPA输出高
EPWM_setActionQualifierAction(myEPWM5_BASE, EPWM_AQ_OUTPUT_A,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA); // 下降过CMPA输出低

/* 动作限定器配置 - B通道PWM波形生成 */
EPWM_setActionQualifierAction(myEPWM5_BASE, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO); // 零点输出低
EPWM_setActionQualifierAction(myEPWM5_BASE, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPB); // 上升过CMPB输出高
EPWM_setActionQualifierAction(myEPWM5_BASE, EPWM_AQ_OUTPUT_B,
EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPB); // 下降过CMPB输出低

/* 死区配置 - 防止桥臂直通 (可选) */
EPWM_setDeadBandDelayMode(myEPWM5_BASE, EPWM_DB_RED, true); // 使能上升沿延迟
EPWM_setDeadBandDelayMode(myEPWM5_BASE, EPWM_DB_FED, true); // 使能下降沿延迟
EPWM_setRisingEdgeDelayCount(myEPWM5_BASE, 10); // 上升沿延迟10个时钟
EPWM_setFallingEdgeDelayCount(myEPWM5_BASE, 10); // 下降沿延迟10个时钟

8、输出 结果

输出 EPWM采集结果:

79a3579703f4bc33709e192a70f2deb9.png

输出打印结果 :

image.png



总结

从这个项目开始到结束,折腾算比较久的,特别是在处理IIC上面,算是收获很丰富,学到了如何使用纳芯微的传感器,读不到地址时怎么去解决问题,特别是调试的时候,怎么排除问题,是软件还是硬件的问题,最终到解决问题,整体把项目完成,并记录,这就是我这次的收获。


附件下载
EPWM.rar
团队介绍
个人
评论
0 / 100
查看更多
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号