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、了解开发板
开发板整体布局

5、方案框图

6、原理图

硬件连接示意图

连接实物图

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采集结果:

输出打印结果 :

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