任务介绍
我这次参加活动的目的本意是希望能够使用原厂提供的评估板来驱动本次活动提供的传感器(除了磁传感器),但是PCB打板调试之后发现插件的引脚封装画错了(虽然也不影响使用),但是在使用I2C扫描的时候可能是因为PCB设计的原因,一直I2C通讯失败,没有从机响应。在折腾了好几天之后决定不再使用额外的传感器设备。因此本次项目选择做的是
- 使用上述芯片设计的开发板/原厂NSSinePad-NS800RT5039开发板
- 调用Uart串口,完成在串口输出 “Hello, NOVOSENSE Wedesign project.” 字符串任务。(难度系数 *)
- 【修改(明确输出波形)】调用ePWM外设,实现在对应输出端口,输出一对互补PWM波形,波形频率2MHz,占空比50%。并使用12指神探捕获对应波形截图(未购买12指神探的可以用万用表电压档测量并拍照)。(难度系数 **)
项目介绍
项目主要包含两个部分的内容
- 调试好串口功能实现串口打印
- 使用EPWM外设,配置好参数使其输出2MHZ的互补50%占空比的PWM波形。
芯片选型和硬件介绍

NSSinePad-NS800RT5039/49 是基于 NS800RT5039/49 实时微控制器设计的旨在帮助用户快 速开展芯片学习、评估等工作的低成本开发板。基于该开发板,用户可以方便使用 NS800RT5039/49 实时微控制器的所有外设、内存。除实时微控制器芯片外,该开发板还具有 板载CAN 收发器(支持CAN2.0B 及 CAN-FD)、两个 5V 编码器(eQEP)接口芯片及板载 DAP Link 调试/仿真器。 开发板功能区域如图1所示。

方案框图和设计思路
方案框图比较简单,因为其UART和EPWM都为这块开发板芯片内部的外设,不涉及额外的传感器。
原理图和PCB设计
PCB的设计有误,也没有找出来问题在哪里,因此这次也没办法做传感器的相关驱动。这里还是贴出来。

PCB 如下所示

几经拆解逐步I2C scan的电路板

软件流程图和关键说明
这里主要需要注意的就是两点,其中一点就是如果使用SDK里example的话,里面的串口是无法被正常输出的,这是因为开发板上的SW1上默认使用的是IO28和29作为UART输出,但是代码中的PIn对应不上,因此如果需要正常的输出串口的话则需要找到28和29然后根据IO复用的串口(串口一)正确初始化即可。
/**
* @brief Initialize uart function
*/
static void uart_init(UART_TypeDef *uart)
{
/* UART2 RX pinmux control */
GPIO_setPinConfig(GPIO_28_SCIA_RX);
GPIO_setAnalogMode(GPIO_28, GPIO_ANALOG_DISABLED);
GPIO_setPadConfig(GPIO_28, GPIO_PIN_TYPE_PULLUP);
GPIO_setQualificationMode(GPIO_28, GPIO_QUAL_SYNC);
GPIO_setDirectionMode(GPIO_28, GPIO_DIR_MODE_IN);
/* UART2 TX pinmux control */
GPIO_setPinConfig(GPIO_29_SCIA_TX);
GPIO_setAnalogMode(GPIO_29, GPIO_ANALOG_DISABLED);
GPIO_setPadConfig(GPIO_29, GPIO_PIN_TYPE_STD);
GPIO_setDriveLevel(GPIO_29, GPIO_DRV_MAX);
GPIO_setDirectionMode(GPIO_29, GPIO_DIR_MODE_OUT);
/* Reset uart before configure it */
UART_resetModule(uart);
/* Set baudrate */
UART_setBaud(uart, 115200);
#if ENABLE_PARITY
/* Set the number of bits per char in UART controller */
UART_setBitCountPerChar(uart, UART_8_BITS_PER_CHAR, true);
/* Sets the type of parity */
UART_setParityMode(uart, UART_PAR_ODD);
#else
/* Set the number of bits per char in UART controller */
UART_setBitCountPerChar(uart, UART_8_BITS_PER_CHAR, false);
#endif
/* Set the number of stop bits */
UART_setStopBitCount(uart, UART_ONE_STOP_BIT);
/* Set MSB bit reverses the order of the bits */
UART_setMSB(uart, false);
#if ENABLE_FIFO
/* Config tx fifo */
UART_enableTxFifo(uart);
UART_resetTxFifo(uart);
UART_setTxFifoWatermark(uart, UART_FIFO_TX6);
/* Config rx fifo */
UART_enableRxFifo(uart);
UART_resetRxFifo(uart);
UART_setRxFifoWatermark(uart, UART_FIFO_RX6);
UART_setRxIdleCharacter(uart, UART_IDLE_CHARACTER_CNT1);
#endif
/* Enable transmitter */
UART_enableTxModule(uart);
/* Enable receiver */
UART_enableRxModule(uart);
}
对于EPWM的代码则是可以参考EPWM的demo进行修改,需要注意的是怎么根据计数器的值来修改自己的频率和占空比。代码如下所示。
void EPWM_init(void)
{
EPWM_setClockPrescaler(myEPWM4_BASE, EPWM_CLOCK_DIVIDER_1, EPWM_HSCLOCK_DIVIDER_1);
EPWM_setTimeBasePeriod(myEPWM4_BASE, 65);
EPWM_setTimeBaseCounter(myEPWM4_BASE, 0);
EPWM_setTimeBaseCounterMode(myEPWM4_BASE, EPWM_COUNTER_MODE_UP_DOWN);
EPWM_setCounterCompareValue(myEPWM4_BASE, EPWM_COUNTER_COMPARE_A, 32);
EPWM_setCounterCompareShadowLoadMode(myEPWM4_BASE, EPWM_COUNTER_COMPARE_A, EPWM_COMP_LOAD_ON_CNTR_ZERO);
// A通道输出
EPWM_setActionQualifierAction(myEPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_ZERO);
EPWM_setActionQualifierAction(myEPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_HIGH, EPWM_AQ_OUTPUT_ON_TIMEBASE_UP_CMPA);
EPWM_setActionQualifierAction(myEPWM4_BASE, EPWM_AQ_OUTPUT_A, EPWM_AQ_OUTPUT_LOW, EPWM_AQ_OUTPUT_ON_TIMEBASE_DOWN_CMPA);
// Deadband使能(互补)
EPWM_setDeadBandDelayMode(myEPWM4_BASE, EPWM_DB_RED, true);
EPWM_setDeadBandDelayMode(myEPWM4_BASE, EPWM_DB_FED, true);
EPWM_setDeadBandDelayPolarity(myEPWM4_BASE, EPWM_DB_RED, EPWM_DB_POLARITY_ACTIVE_HIGH);
EPWM_setDeadBandDelayPolarity(myEPWM4_BASE, EPWM_DB_FED, EPWM_DB_POLARITY_ACTIVE_LOW);
}
实物演示
串口输出

使用十二指神探测量出来的PWM占空比2MHZ (50 占空比)
手持示波器测量出来的波形

实物图

遇见的难点和解决方案
这次遇见的最难的就是这个PCB的设计,也不知道到底是哪里出了问题导致我的I2C通信一直失败。连续折腾了好几天,支这一次我承认是困难战胜了我。 还有一点麻烦的是这个SDK在keil中编译的时候会有很多警告信息,需要再宏编译的杂项中忽略掉这些警告,否则编译时间非常非常的久。
心得体会
上次参加Wedesign活动的成功(设计的PCB调试完美运行)使我这次有一点飘飘然,想着又可以增长一些硬件的知识。没错确实增长了,但是这次是真的没有搞定这个PCB,不过好歹软件的串口输出和EPWM的输出已经完成。
