PWM捕获实验:用于检测外部PWM信号的频率与占空比
1.新建一个工程
根据开发板芯片型号新建一个工程,命名为Capture;
2.在原理图中添加组件
首先添加一个引脚,用于外部PWM信号的输入;然后添加两个TimerCounter,分别用于记录单位周期内高电平持续时间与低电平持续时间;给TimerCounter添加合适的时钟Clock2;添加一个串口UART组件,用于打印数据;
3.配置组件
3.1配置UART组件
3.2分别配置Timer1和Timer2的属性
配置基本相同,除了reload与capture的触发方式不同;
3.3 Timer1与Timer2的时钟配置
两这的时钟源必须一致,此时钟的配置直接影响PWM信号采集的范围与精度;
假设是时钟源配置为f,则最大捕获周期T与最小捕获周期t分别如下:
T = 65525/f+65535/f.
t=1/f+1/f
4.绑定MCU引脚
5.生成代码&移植
int main(void)
{
char snum[50]={0};
uint32_t highCaptureCount=0;
uint32_t lowCaptureCount=0;
uint32_t period=0;
uint32_t Duty=0;
CyGlobalIntEnable; /* Enable global interrupts. */
/* Place your initialization/startup code here (e.g. MyInst_Start()) */
UART_Start();
/*start timers*/
Timer_1_Start();
Timer_2_Start();
for(;;)
{
/* Place your application code here. */
CyDelay(2000);
/*Get Capture num*/
highCaptureCount = Timer_1_ReadCapture();
printf("The highCaptureCount : %d\r\n",highCaptureCount);
lowCaptureCount = Timer_2_ReadCapture();
printf("The lowCaptureCount : %d\r\n",lowCaptureCount);
/*Period*/
period=highCaptureCount+lowCaptureCount;
printf("The period : %d\r\n",period);
/*frequence count*/
Capture_Fre= CAPTURECLOCK / period;
Duty=(100*highCaptureCount/period);
sprintf(snum,"\r\n Capture Frequence:%d Hz,Duty=%d\r\n",Capture_Fre,Duty);
UART_UartPutString(snum);
//printf("The function id starting : %d\r\n",666);
// CyDelay(500);
}
}
6.实验结果:
7.总结
这样设置后就可以准确的测量出外部的PWM信号频率与占空比;
但是存在一下问题:
第一:一开始上电时,IO口并没有给定PWM信号,但是highCaptureCount与lowCaptureCount均为65535,最大值;
第二:采集过程中突然中断PWM信号,此时读到的highCaptureCount与lowCaptureCount是一个随机值,频率也为随机值;
第三:采集到的频率范围与CLOCK2的设置有关,对于几Hz与几KHz,并不能完全兼顾;
应该有更好的方式来采集PWM信号的频率与脉宽,最好中断形式;目前还在探索中;