本次实验利用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位定时器使用。
PWDT在做为脉冲宽度测量功能使用时具有多种工作模式,可以根据具体的应用需求进行选择。实验中被用于测量的源波来自于PWM模块产生的周期为10KHz、占空比为25%的PWM波。为便于观察同时配置了两路PWM输出,PWM1_CH6用做被测源输出;PWM1_CH7用于逻辑分析仪捕捉分析。下面是两个PWM输出通道的输出波型:
从上面的波型图中的参数可以看出PWM波的周期为0.1ms(10KHz)、高电平脉冲宽度为25us、低电平脉冲宽度为75us。根据被测源的波型特点选择PWDT模块单通道输入的“基本测量模式”,并且选择“基本测量模式”中四种测量方式的一种:
这种测量方式从脉冲的第一个上升沿开始之后的所有上升沿和下降沿都将会被“PWDT”抓到。为提高测量窄脉冲的精度,“PSC”要与实际测量情况相匹配。相关及其它一些参数如下寄存器描述:
三、硬件连接
PWDT0_IN1被配置在PC5端口;PWM1_CH6输出被配置在PC9。由于之前已将排针补焊上了,直接用导线将两只引脚相连很方便:
四、代码实现
使用“AutoGen Studio”进行配置,同时开了串口。如:
通过下面的代码将PWM1_CH6和PWM1_CH7输出10KHz、占空比为25%的PWM波:
void ATC_PWM1_Init(void)
{
PWM_ConfigType pwmConfig;
PWM_ModulationConfigType initModeStruct;
MSP_PWM_Init(PWM1);
pwmConfig.mode = PWM_MODE_MODULATION;
pwmConfig.clkSource = PWM_CLK_SOURCE_APB;
pwmConfig.clkPsc = 0;
pwmConfig.initValue = 0;
pwmConfig.maxValue = 2399;
pwmConfig.overflowInterrupEn = DISABLE;
pwmConfig.cntOverflowFreq = 0;
pwmConfig.interruptEn = DISABLE;
initModeStruct.countMode = PWM_UP_COUNT;
initModeStruct.deadtime = 0;
initModeStruct.deadtimePsc = PWM_DEADTIME_DIVID_1;
initModeStruct.initChOutputEn = DISABLE;
initModeStruct.initTriggerEn = DISABLE;
PWM_IndependentChConfig independentChConfig[2];
/* independent channel 6 configuration */
independentChConfig[0].channel = PWM_CH_6;
independentChConfig[0].chValue = 599;
independentChConfig[0].levelMode = PWM_HIGH_TRUE;
independentChConfig[0].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;
independentChConfig[0].interruptEn = DISABLE;
independentChConfig[0].initLevel = PWM_LOW_LEVEL;
independentChConfig[0].triggerEn = DISABLE;
/* independent channel 7 configuration */
independentChConfig[1].channel = PWM_CH_7;
independentChConfig[1].chValue = 599;
independentChConfig[1].levelMode = PWM_HIGH_TRUE;
independentChConfig[1].polarity = PWM_OUTPUT_POLARITY_ACTIVE_HIGH;
independentChConfig[1].interruptEn = DISABLE;
independentChConfig[1].initLevel = PWM_LOW_LEVEL;
independentChConfig[1].triggerEn = DISABLE;
initModeStruct.independentChannelNum = 2;
initModeStruct.independentChConfig = independentChConfig;
pwmConfig.initModeStruct = &initModeStruct;
PWM_Init(PWM1, &pwmConfig);
}
下面是PWDT0_IN1配置代码:
void ATC_PWDT0_Init(void)
{
PWDT_ConfigType pwdtConfig;
MSP_PWDT_Init(PWDT0);
pwdtConfig.clkPsc = PWDT_CLK_PRESCALER_1;
pwdtConfig.edgeType = PWDT_RISING_START_CAPTURE_ALL;
pwdtConfig.channel = PWDT_INPUT_CH_1;
pwdtConfig.overflowInterruptEn = ENABLE;
pwdtConfig.readyInterruptEn = ENABLE;
pwdtConfig.interruptEn = ENABLE;
pwdtConfig.cmpModeEn = DISABLE;
pwdtConfig.mode = PWDT_MEASURE_MODE;
pwdtConfig.hallModeEn = DISABLE;
pwdtConfig.filterEn = DISABLE;
pwdtConfig.callBack = PWDT0_IRQHandler_Callback;
PWDT_Init(PWDT0, &pwdtConfig);
}
取出被抓数据:
/**
* [url=home.php?mod=space&uid=247401]@brief[/url] This function handle PWDT0 interrupt.
* @param[in] device: PWDT_Type pointer
* @param[in] wpara: callback parameter
* @param[in] lpara: callback parameter
* [url=home.php?mod=space&uid=266161]@return[/url] none
*/
void PWDT0_IRQHandler_Callback(void *device, uint32_t wpara, uint32_t lpara)
{
if (wpara & PWDT_INIT0_OVF_Msk)
{
/* USER CODE BEGIN OVERFLOW INTERRUPT */
/* USER CODE END OVERFLOW INTERRUPT */
}
if (wpara & PWM_STR_CHSF_Msk)
{
/* USER CODE BEGIN PLUSE PLUSE EFFECTIVE */
/* USER CODE END PLUSE PLUSE EFFECTIVE */
}
/* USER CODE BEGIN PWDT0_IRQHandler_Callback */
if (wpara & PWDT_INIT0_RDYF_Msk)
{
Positive_Pulse_Width = PWDT_GetPositivePulseWidth(PWDT0);
negative_Pulse_Width = PWDT_GetNegativePulseWidth(PWDT0);
printf("\n Positive_Pulse_Width = %d\r\n", Positive_Pulse_Width);
printf("\n negative_Pulse_Width = %d\r\n", negative_Pulse_Width);
}
/* USER CODE END PWDT0_IRQHandler_Callback */
}
五、实验结果
六、实验总结
通过实验对PWDT模块相关知识有了了解,其用于霍尔测量的三通道输入测量模式用于电机的测量会是一个不错的选择。
|