在线时间613 小时
UID252169
注册时间2010-12-5
NXP金币0
TA的每日心情 | 开心 2019-2-14 16:49 |
---|
签到天数: 296 天 连续签到: 1 天 [LV.8]以坛为家I
金牌会员
 
- 积分
- 4473
- 最后登录
- 2020-4-14
|
本帖最后由 zhjb1 于 2016-9-2 16:58 编辑
FRDM_KL25Z 实验四 TPM_PWM和PIT_计数器测试
由于低功耗需要对应的低功耗电源管理和模块,暂时放一下,完成常规功能测试后再实现低功耗的问题。
本实验稍微需要注意点,需要查看KL25手册结合案例修改适合测试结果。
1. TPM实验
TPM实验是为了测试PWM输出的问题,按照函数引用简单可靠,先将TPM中的drv中的MKL_tpm.h和MKL_tpm.c拷贝到本程序的drv目录中,再include他们到本程序中,而后就是分析模块:
MKL_tpm.c中有关于PWM的设置
原来的打开PTM0和PTM2的时钟,看手册想使用PTB口而不用PTD口[已用做LCD了],看手册PTB1是PTM1_CH1,PTB2是PTM2_CH0,因此将
SIM_SCGC6 |= SIM_SCGC6_TPM0_MASK | SIM_SCGC6_TPM2_MASK;//打开TPM0,2时钟,改为
SIM_SCGC6 |= SIM_SCGC6_TPM1_MASK | SIM_SCGC6_TPM2_MASK;//打开TPM1,2时钟
对应的tpmInit()改成为:
void tpmInit(void){
SIM_SCGC5 |= SIM_SCGC5_PORTB_MASK | SIM_SCGC5_PORTD_MASK;//打开GPIO时钟
SIM_SCGC6 |= SIM_SCGC6_TPM1_MASK | SIM_SCGC6_TPM2_MASK;//打开TPM1,2时钟
SIM_SOPT2 |= SIM_SOPT2_PLLFLLSEL_MASK | SIM_SOPT2_TPMSRC(1);//打开时钟门
PORTB_PCR1 = ( 0 | PORT_PCR_MUX(3));//TPM1_CH1 enable on PTB1
PORTB_PCR2 = ( 0 | PORT_PCR_MUX(3));//TPM2_CH0 enable on PTB2
TPM1_MOD = duty;//TPM_MODULE;
TPM1_C1SC = TPM_Cn_MODE;//No Interrupts; High True pulses on Edge Aligned PWM
TPM1_C1V = duty1;//TPM_INIT_VAL;
TPM1_SC = TPM_SC_CMOD(1) | TPM_SC_PS(0);//Edge Aligned PWM running from BUSCLK / 1
TPM2_MOD = duty-4000;//TPM_MODULE;
TPM2_C0SC = TPM_Cn_MODE;//No Interrupts; Low True pulses on Edge Aligned PWM
TPM2_C0V = duty2;//pulse width
TPM2_SC = TPM_SC_CMOD(1) | TPM_SC_PS(0);//Edge Aligned PWM running from BUSCLK / 1
}
由于想自己设置周期,因此用duty作为时基,duty1和duty2作为2路脉宽变量
主程序中增加了tpmInit();和更改dutyx的两段小程序,给出一段:
//PWM DUTY Change
void pwmPlu1(void){TPM1_C1V=duty1;}//pulse width
在循环体中增加:
if(duty1<20) duty1=6000;
duty1 -=ddt1;pwmPlu1();
用以改变PWM脉宽,示波器上看到宽度的变化。
duty设置为6000,因为对应的主频是6MHz,每步进改变10。
2. PIT实验
同样,将MKL_PIT.c和MKL_PIT.h拷贝到本目录中,Include进来,PIT是内部时钟,采用中断方式,不需要外部IO口,所以只是将MKL_PIT.c中的时间改成600000,系统时钟是6MHz,此PIT没0.1秒中断一次。
main.c中增加了中断函数,用户程序仅仅为计数值增1:
//PIT Interupt
void PIT_IRQHandler(void){
PIT_TFLG0 |= PIT_TFLG_TIF_MASK;//标志位清空
t0++;tt++;//用户程序
}
在主函数初始化中加入中断声明:
NVIC_EnableIRQ(PIT_IRQn);//PIT中断使能
NVIC_SetPriority(PIT_IRQn,3);//设置PIT中断优先级
__enable_irq();//使能总中断
PIT中断函数中的tt作为显示控制,tt==2时显示和UART0 1次
结果见照片和视频。PWM两路频率差3倍,因此不能同步显示,采用存储的方式可以看清楚结果。视频链接:,看不了时,点击下边的地址。
https://v.youku.com/v_show/id_XMTcxMDIzNDU4OA==.html?beta&
|
-
LCD显示的计数值,ADC[16次平均]和两路PWM
-
实时显示的结果,上边的PWM可同步
-
存储显示的两路PWM
|