[学习笔记] 【AutoChips 7801x MCU评测报告】五、PWDT

[复制链接]
7576|15
 楼主| lisingch 发表于 2020-6-20 19:12 | 显示全部楼层 |阅读模式
      本次实验利用PWDT0_IN1通道采集PWM1_CH6输出的PWM波,将采集到的高电平、低电平的脉冲宽度通过串口发送至PC端,通过串口助手软件进行显示。具体实验过程如下:

一、实验资源
1、AC7801x开发板;
2、AutoGen Studio 1.3.0;
3、KEIL 5.28.0.0;
4、ST-LINK2;
5、逻辑分析仪;
6、串口助手

二、资源简介
      AC7801x系列的脉冲宽度检测定时器(PWDT)既可用于脉冲宽度测量又可以当做16位定时器使用。
2020-06-20_180504.png
2020-06-20_180518.png
2020-06-20_180539.png
2020-06-20_180558.png

      PWDT在做为脉冲宽度测量功能使用时具有多种工作模式,可以根据具体的应用需求进行选择。实验中被用于测量的源波来自于PWM模块产生的周期为10KHz、占空比为25%的PWM波。为便于观察同时配置了两路PWM输出,PWM1_CH6用做被测源输出;PWM1_CH7用于逻辑分析仪捕捉分析。下面是两个PWM输出通道的输出波型:
2020-06-20_145032.png
2020-06-20_145042.png
2020-06-20_145056.png
      从上面的波型图中的参数可以看出PWM波的周期为0.1ms(10KHz)、高电平脉冲宽度为25us、低电平脉冲宽度为75us。根据被测源的波型特点选择PWDT模块单通道输入的“基本测量模式”,并且选择“基本测量模式”中四种测量方式的一种:
2020-06-20_183631.png
      这种测量方式从脉冲的第一个上升沿开始之后的所有上升沿和下降沿都将会被“PWDT”抓到。为提高测量窄脉冲的精度,“PSC”要与实际测量情况相匹配。相关及其它一些参数如下寄存器描述:
2020-06-20_184129.png
2020-06-20_184209.png
2020-06-20_184228.png
2020-06-20_184307.png

三、硬件连接
      PWDT0_IN1被配置在PC5端口;PWM1_CH6输出被配置在PC9。由于之前已将排针补焊上了,直接用导线将两只引脚相连很方便:
微信图片_20200620185311.jpg

四、代码实现
      使用“AutoGen Studio”进行配置,同时开了串口。如:
2020-06-20_190215.png

通过下面的代码将PWM1_CH6和PWM1_CH7输出10KHz、占空比为25%的PWM波:
  1. void ATC_PWM1_Init(void)
  2. {
  3.     PWM_ConfigType pwmConfig;
  4.     PWM_ModulationConfigType initModeStruct;

  5.     MSP_PWM_Init(PWM1);

  6.     pwmConfig.mode = PWM_MODE_MODULATION;
  7.     pwmConfig.clkSource = PWM_CLK_SOURCE_APB;
  8.     pwmConfig.clkPsc = 0;
  9.     pwmConfig.initValue = 0;
  10.     pwmConfig.maxValue = 2399;
  11.     pwmConfig.overflowInterrupEn = DISABLE;
  12.     pwmConfig.cntOverflowFreq = 0;
  13.     pwmConfig.interruptEn = DISABLE;

  14.     initModeStruct.countMode = PWM_UP_COUNT;
  15.     initModeStruct.deadtime = 0;
  16.     initModeStruct.deadtimePsc = PWM_DEADTIME_DIVID_1;
  17.     initModeStruct.initChOutputEn = DISABLE;
  18.     initModeStruct.initTriggerEn = DISABLE;

  19.     PWM_IndependentChConfig independentChConfig[2];

  20.     /* independent channel 6 configuration */
  21.     independentChConfig[0].channel = PWM_CH_6;
  22.     independentChConfig[0].chValue = 599;
  23.     independentChConfig[0].levelMode = PWM_HIGH_TRUE;
  24.     independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;
  25.     independentChConfig[0].interruptEn = DISABLE;
  26.     independentChConfig[0].initLevel = PWM_LOW_LEVEL;
  27.     independentChConfig[0].triggerEn = DISABLE;

  28.     /* independent channel 7 configuration */
  29.     independentChConfig[1].channel = PWM_CH_7;
  30.     independentChConfig[1].chValue = 599;
  31.     independentChConfig[1].levelMode = PWM_HIGH_TRUE;
  32.     independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;
  33.     independentChConfig[1].interruptEn = DISABLE;
  34.     independentChConfig[1].initLevel = PWM_LOW_LEVEL;
  35.     independentChConfig[1].triggerEn = DISABLE;

  36.     initModeStruct.independentChannelNum = 2;
  37.     initModeStruct.independentChConfig = independentChConfig;

  38.     pwmConfig.initModeStruct = &initModeStruct;

  39.     PWM_Init(PWM1, &pwmConfig);

  40. }

下面是PWDT0_IN1配置代码:
  1. void ATC_PWDT0_Init(void)
  2. {
  3.     PWDT_ConfigType pwdtConfig;

  4.     MSP_PWDT_Init(PWDT0);

  5.     pwdtConfig.clkPsc = PWDT_CLK_PRESCALER_1;
  6.     pwdtConfig.edgeType = PWDT_RISING_START_CAPTURE_ALL;
  7.     pwdtConfig.channel = PWDT_INPUT_CH_1;
  8.     pwdtConfig.overflowInterruptEn = ENABLE;
  9.     pwdtConfig.readyInterruptEn = ENABLE;
  10.     pwdtConfig.interruptEn = ENABLE;
  11.     pwdtConfig.cmpModeEn = DISABLE;
  12.     pwdtConfig.mode = PWDT_MEASURE_MODE;
  13.     pwdtConfig.hallModeEn = DISABLE;
  14.     pwdtConfig.filterEn = DISABLE;
  15.     pwdtConfig.callBack = PWDT0_IRQHandler_Callback;

  16.     PWDT_Init(PWDT0, &pwdtConfig);

  17. }

取出被抓数据:
  1. /**
  2. * [url=home.php?mod=space&uid=247401]@brief[/url] This function handle PWDT0 interrupt.
  3. * @param[in] device: PWDT_Type pointer
  4. * @param[in] wpara: callback parameter
  5. * @param[in] lpara: callback parameter
  6. * [url=home.php?mod=space&uid=266161]@return[/url] none
  7. */
  8. void PWDT0_IRQHandler_Callback(void *device, uint32_t wpara, uint32_t lpara)
  9. {
  10.     if (wpara & PWDT_INIT0_OVF_Msk)
  11.     {
  12.         /* USER CODE BEGIN OVERFLOW INTERRUPT */

  13.         /* USER CODE END OVERFLOW INTERRUPT */
  14.     }

  15.     if (wpara & PWM_STR_CHSF_Msk)
  16.     {
  17.         /* USER CODE BEGIN PLUSE PLUSE EFFECTIVE */

  18.         /* USER CODE END PLUSE PLUSE EFFECTIVE */
  19.     }

  20.     /* USER CODE BEGIN PWDT0_IRQHandler_Callback */

  21.     if (wpara & PWDT_INIT0_RDYF_Msk)
  22.     {
  23.         Positive_Pulse_Width = PWDT_GetPositivePulseWidth(PWDT0);
  24.         negative_Pulse_Width = PWDT_GetNegativePulseWidth(PWDT0);

  25.         printf("\n Positive_Pulse_Width = %d\r\n", Positive_Pulse_Width);
  26.                                 printf("\n negative_Pulse_Width = %d\r\n", negative_Pulse_Width);
  27.     }
  28.     /* USER CODE END PWDT0_IRQHandler_Callback */
  29. }

五、实验结果
2020-06-20_175943.png

六、实验总结
      通过实验对PWDT模块相关知识有了了解,其用于霍尔测量的三通道输入测量模式用于电机的测量会是一个不错的选择。

 楼主| lisingch 发表于 2020-6-20 20:59 | 显示全部楼层
刚才突然出了点问题,ST-LINK找不到器件了,换成J-LINK也不行......最后又换成ST-LINK,按着板子上的复位键再点击下载,试了几次后又正常了,不知道是什么原因?
2020-06-20_204747.png
2020-06-20_205110.png
 楼主| lisingch 发表于 2020-6-20 21:16 | 显示全部楼层
又不行了,每次都要按着复位键下载,程序也能写入,写入的程序也能运行。
2020-06-20_211026.png

RunningX 发表于 2020-6-22 10:07 | 显示全部楼层
程序里是不是使能PA13为RTC_CLKOUT功能了,使用时需要多注意这个点。
 楼主| lisingch 发表于 2020-6-22 10:56 | 显示全部楼层
RunningX 发表于 2020-6-22 10:07
程序里是不是使能PA13为RTC_CLKOUT功能了,使用时需要多注意这个点。

谢谢提醒!这一点忽视了。
比神乐 发表于 2020-6-22 11:47 | 显示全部楼层
楼主很厉害
 楼主| lisingch 发表于 2020-6-22 12:04 | 显示全部楼层

厉害啥?板子都玩坏了
mzy2364 发表于 2021-5-31 09:38 | 显示全部楼层
楼主你好,我在使用AC7801的时候,使用的内部晶振,在做PWDT采集的时候,采集到的频率和占空比都不对,而且我增加占空比的时候,单片机采集到的也不是跟着增加,,变化跟输入的占空比似乎关系不大,相同的结构体配置在AC781的开发板上面是可以的,请问是什么原因呢?
 楼主| lisingch 发表于 2021-5-31 12:46 | 显示全部楼层
mzy2364 发表于 2021-5-31 09:38
楼主你好,我在使用AC7801的时候,使用的内部晶振,在做PWDT采集的时候,采集到的频率和占空比都不对,而且 ...

时间有点长,具体细节一时还回答不了,抱歉!您可以多看看相关例程和手册,这可能要快捷点。
lichengbao610 发表于 2022-1-28 13:13 | 显示全部楼层
请问楼主,为什么,我测试时PWDT只能抓到少部分脉冲宽度,没抓完整?
kyzhd 发表于 2022-1-28 14:47 | 显示全部楼层
老哥的技术帖的知识含量就是高啊
 楼主| lisingch 发表于 2022-1-28 18:53 | 显示全部楼层
kyzhd 发表于 2022-1-28 14:47
老哥的技术帖的知识含量就是高啊

谢谢夸奖,继续努力!
kiwis66 发表于 2022-3-7 10:49 | 显示全部楼层
也有代码生成工具?
redone 发表于 2022-3-7 14:55 | 显示全部楼层
RunningX 发表于 2020-6-22 10:07
程序里是不是使能PA13为RTC_CLKOUT功能了,使用时需要多注意这个点。

又是一个小细节
ZJY135790 发表于 2022-10-28 11:36 | 显示全部楼层
引脚的边沿检测逻辑可以复位吗,比如少时间没有脉冲,我下一次要重新开始
sperper 发表于 2023-11-18 23:06 | 显示全部楼层
本帖最后由 sperper 于 2024-8-16 17:49 编辑

111
您需要登录后才可以回帖 登录 | 注册

本版积分规则

99

主题

15005

帖子

19

粉丝
快速回复 在线客服 返回列表 返回顶部