本帖最后由 zhjb1 于 2024-12-17 10:31 编辑
五、PWM PWM是一款MCU的基本功能,可以测试其GPIO在可控范围最大输出的脉冲数,尽管超过10MHz频率的PWM目前很少有实际用途,但不妨一试最大GPIO的翻转速度。 查看工程examples,没有直接标明PWM的实例,由于PWM源于time,所以打开CFGTMR的项目看有非常多的基于timer的实例见截图第一张: 本实验做PWMOutput这个实例,因为WPM关心的是频率和脉宽,这些在LCD上显示看不出结果,直接用示波器和串口查看,当然示波器的数据最直接。为了测试“最大”输出频率,将while中的源代码:
frequencyHZ += 10000U;//按一下key1,步进10K if (frequencyHZ > 100000){//不超过100K frequencyHZ = 10000U;//返回10K } 改成: frequencyHZ += 1500000U;//按键key1步进1.5M if (frequencyHZ > 25000000){超过25M frequencyHZ = 10000000U;//返回10M } 下截图是电脑虚拟串口的数据,脉宽调成50%,第二张。 下图是示波器的照片拼图,第三张示意如下:左上12MHz、左下24MHz、右边上到下分别为:1MHz、3MHz、5MHz测试发现当频率在3M以内波形还不错,当超过5M时,波形上升和下降沿开始圆滑,达到5M始开始成为锯齿波,并且福大开始下降,达到10M以上幅值只有1.7V左右,达到最高24M时只有1.3V峰峰值了。这与我测的其他的MCU差不多。
这款主频最高100多MHz的MCU其IO口的翻转速度已经很不错了。 其实目的是为了观测IO口最快响应速度,足够快的响应速度可以直接作为测量外设的频率输入口。 本实验PWMOut时PMD1口,控制绿色LED,只能看到LED一直亮——反应不过来了。 如果想进一步测试IO口的翻转速度比较麻烦,他的代码有点难读懂。尝试过对PWM的设置按照变量定义,函数追踪等常规遍历方法比较费劲。只能以后再说了。这种代码方法对于代码保密和防止抄袭有利,但对于用惯了寄存器控制或最少最简代码实现相同功能以及代码可读性带来困难。 到此联想到在做VL35L0X激光测距传感器实验时,ST厂家压根就不提供传感器的控制方式手册——命令手册,提供了一个API,像查找一个控制变量或函数几乎很困难,当然,他为了必须选自己的MPU这么做无可厚非,但给移植带来极大的困难。 六、中断_比较 想做DAC测试,遍历找到了COMP/COMP_DAC本来想做DAC这是比较也可以。 打开项目,初看源码,这是采用中断触发的比较测试,不错中断是一个MCU中最重要的基本功能之一,用好了在多任务中会化繁从简是的主函数简练,功能性的由中断服务完成。比较中断服务函数: void ComparatorISR(void){ //Variable used to store comparator output flags COMP_OUTPUT_TRIG_T outputFlags; //Read output flags COMP_GetOutputFlags(0, &outputFlags); if (outputFlags == COMP_EVEN_INT_BY_FALLING_EDGE) { LED_On(LED_RED); LED_Off(LED_GREEN); } else if (outputFlags == COMP_EVEN_INT_BY_RISING_EDGE) { LED_On(LED_GREEN); LED_Off(LED_RED); } else { //Switch on both LEDs LED_On(LED_RED); LED_On(LED_GREEN); } //Clear output flags COMP_ClearOutputFlags(0); } 代码主要是如果下降沿触发——绿色LED亮,如果上升沿触发红色LED亮,初始状态三色亮——白色了。 视频链接地址:
设置好之后下载测试,我接了一个微调控制电平测试,结果见照片,最后一张。
|