TA的每日心情 | 开心 2016-3-22 09:25 |
---|
签到天数: 115 天 连续签到: 1 天 [LV.6]常住居民II
|
本例演示的是使用SAM4L68脚PC04作为波形输出,
然后使用66脚PC02作为波形捕获输入通道,
对该PIN捕获的脉冲数、周期、脉宽进行计数。
先来看看实验的现象,烧录程序后,默认的方波设置是
频率178Hz,占空比30%
逻辑分析仪捕获到的波形如下
特别需要注意的是,SAM4L-EK开发板的排座和跳线帽比较多,此例需要即将PC02与PC04
两个PIN进行短接,即下图中的PIN3与PIN7
再次将频率和占空比分别设置为1000Hz80%
逻辑分析仪测试到的波形如下,可以看到产生的波形还是很精准的
其中占空比也有可以用上图计数到的RA和RB的真实时间来计算,如下
以(178HZ,30%)为例,
4212-2948/4212 = 0.30009
我们将J4 PIN3与PIN7连接的杜邦线给断开,
测试的结果如下,可以看到,捕获通道此时并没有捕获到任何脉冲
波形捕获的中断函数如下,图中指示的变量使用来计数捕获到的脉冲数的
波形产生于捕获的相关初始化函数:
static void tc_waveform_initialize(void)
{
uint32_t ra, rc;
/* Configure the PMC to enable the TC module. */
sysclk_enable_peripheral_clock(ID_TC_WAVEFORM);
#if SAMG55
/* Enable PCK output */
pmc_disable_pck(PMC_PCK_3);
pmc_switch_pck_to_mck(PMC_PCK_3, PMC_PCK_PRES_CLK_1);
pmc_enable_pck(PMC_PCK_3);
#endif
/* Init TC to waveform mode. */
tc_init(TC, TC_CHANNEL_WAVEFORM,
/* Waveform Clock Selection */
gc_waveconfig[gs_uc_configuration].ul_intclock
| TC_CMR_WAVE /* Waveform mode is enabled */
| TC_CMR_ACPA_SET /* RA Compare Effect: set */
| TC_CMR_ACPC_CLEAR /* RC Compare Effect: clear */
| TC_CMR_CPCTRG /* UP mode with automatic trigger on RC Compare */
);
/* Configure waveform frequency and duty cycle. */
rc = (sysclk_get_peripheral_bus_hz(TC) /
divisors[gc_waveconfig[gs_uc_configuration].ul_intclock]) /
gc_waveconfig[gs_uc_configuration].us_frequency;
tc_write_rc(TC, TC_CHANNEL_WAVEFORM, rc);
ra = (100 - gc_waveconfig[gs_uc_configuration].us_dutycycle) * rc / 100;
tc_write_ra(TC, TC_CHANNEL_WAVEFORM, ra);
/* Enable TC TC_CHANNEL_WAVEFORM. */
tc_start(TC, TC_CHANNEL_WAVEFORM);
printf("Start waveform: Frequency = %d Hz,Duty Cycle = %2d%%\n\r",
gc_waveconfig[gs_uc_configuration].us_frequency,
gc_waveconfig[gs_uc_configuration].us_dutycycle);
}
/**
* \brief Configure TC TC_CHANNEL_CAPTURE in capture operating mode.
*/
//! [tc_capture_init]
static void tc_capture_initialize(void)
{
/* Configure the PMC to enable the TC module */
sysclk_enable_peripheral_clock(ID_TC_CAPTURE);
#if SAMG55
/* Enable PCK output */
pmc_disable_pck(PMC_PCK_3);
pmc_switch_pck_to_mck(PMC_PCK_3, PMC_PCK_PRES_CLK_1);
pmc_enable_pck(PMC_PCK_3);
#endif
/* Init TC to capture mode. */
tc_init(TC, TC_CHANNEL_CAPTURE,
TC_CAPTURE_TIMER_SELECTION /* Clock Selection */
| TC_CMR_LDRA_RISING /* RA Loading: rising edge of TIOA */
| TC_CMR_LDRB_FALLING /* RB Loading: falling edge of TIOA */
| TC_CMR_ABETRG /* External Trigger: TIOA */
| TC_CMR_ETRGEDG_FALLING /* External Trigger Edge: Falling edge */
);
}
//! [tc_capture_init]
限于篇幅 ,此篇就不就数据结构和程序流程进行详细分析了。 |
|