各位好,由于项目要求我需要利用msp430f5438a产生这样的脉冲信号来控制电路:连续产生5个脉冲信号,每个脉冲信号的周期都是8us,其中高电平长度为3.5us,接着产生1960us的低电平,以此循环。
在之前调试过程中我尝试直接用定时器定时,或者是利用定时器产生PWM波这两种方法来产生上述信号。
在直接利用定时器定时的时候,只能做到产生高低电平均为4us的方波信号,要想产生高电平为3.5us且周期为8us的脉冲信号时,单片机开始跑飞,只能产生连续的波形而没有那1960us的低电平,且连续波形的周期也不再是8us。更改脉冲信号高电平部分的计数值时,时钟频率变得不可控。原先计数值为32时可定时4us,但是30的时候却不是3.75us而是3.5us。
在尝试产生pwm波时,可以很好的产生高电平为3.5us,周期为8us的连续pwm波,但是在尝试结合中断来产生1960us的低电平时,单片机跑飞。
这个是我初始化时钟的程序:
void Init_Clk(void)
{
WDTCTL = WDTPW + WDTHOLD; // 关看门狗
P5SEL |= 0x0C; // 端口功能选择振荡器
UCSCTL6 &= ~XT2OFF; // 振荡器使能
UCSCTL3 |= SELREF_2; // FLLref = REFO
UCSCTL4 |= SELA_2; // ACLK=REFO,SMCLK=DCO,MCLK=DCO
do
{
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG;
}while(SFRIFG1&OFIFG); // 检测振荡器错误标志
UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1; // XT2 驱动模式 24~32MHz
UCSCTL4 |= SELS_5 + SELM_5; // SMCLK = MCLK = XT2
}
使用定时器A,分频系数设为1 ,设定计数值为32的时候可以定时4us。
我的问题是:
1. 如果用定时器直接定时,怎样才能改变时钟频率不定的情况?
2. 如果用pwm波的方式,怎样结合中断,在产生5个方波信号以后,重新给定时器写入计数值来产生1960us的低电平
灰小子:
1、可以用定时器定时一个完整循环的时间,在中断服务程序中实现5个你要的脉冲,然后IO置低电平并退出中断服务程序,这样IO会继续输出低电平得到你要的1960us的低电平,直到定时器再次产生中断进行下个循环
2、若是使用PWM,在产生5个方波信号以后,可以把该比较模块切换到模式0,由OUT寄存器控制输出低电平