您好!
我正在使用代码(如下所示)生成脉冲序列(20mSec 重复率和7个500Hz 脉冲)。 现在、我要对其进行修改、使脉冲序列的第1个脉冲的频率为1kHz、而 REST 7脉冲的频率为500Hz、并且重新生成20mSec。
所需的波形已附加。
我尝试通过更改 第一 个脉冲计数的 TA0CCR0和 TA0CCR1来修改它、但它不起作用。 有人能帮我吗? 提前感谢。 )
#include
#include
//可设置(在某些限制内)
//这些设置在 P1.2上生成可见输出。
#define long_Hz 50UL //长周期重复频率为50Hz
#define SHORT 周期2000UL //短(PWM)周期:2000个计时器节拍= 2ms
#define SHORT_CNT 7U //每个长周期中有7个短脉冲
//推导出
#define TIMER_Hz 1000000UL // 1MHz 时的定时器节拍(SMCLK/8 [ID=3])
#define LON_PERIOD (TIMER_Hz/LON_Hz) //长时间内的定时器节拍
#define LON_CNT (LON_PERIODE/SHORT_PERIOD)//长周期中的 PWM 周期
//从1到 LCNT 计数,以跟踪长周期。
uint16_t short_cycles;
// OUTMOD=7提供非反相 PWM (高、低)、这正是人们所期望的。
//后半部分也是低电平,因此我们可以切换到 OUT=0而不会出现毛刺脉冲。
#define CCTL_OUTMOD (OUTMOD_7)
#define CCTL_OUT (0*OUT)
// pulse_isr ()
//每短周期计时器节拍中断一次,但最后期限为短周期/2,所以不要进行 dawdle。
#pragma vector=TIMER0_A1_vector
_interrupt void
PULSE_ISR (空)
{
TA0CCTL1 &=~CCIFG; //我们确实应该查看 TA0IV,但我们只启用 CCTL1:CCIE
++SHort_cycles; //向上计数(短) PWM 周期
//对于第一个 SHORT_CNT PWM 周期、只需让 PWM 运行
if (short_cycles < short_CNT)
{
/*empty*/
}
//对于下一个(long_CNT-short_CNT)周期、使用 out=0将其保持为低电平
否则、如果(short_cycles < long_CNT)
{
//使用 OUTMOD=0、OUT=0强制它为低电平
//我们重复执行此操作,但这比检查便宜。
TA0CCTL1 &=~OUTMOD_7; // OUTMOD=0 (OUT)。 我们提前设置(=0)。
}
//在 LON_CNT short (PWM)周期后、重新启动长周期
其他
{
//重新启动 PWM。 在第二个半周期结束前、输出不会改变。
TA0CCTL1 |= CCTL_OUTMOD; //返回复位/设置
short_cycles = 0;
}
返回;
}
//
// main()
//
内部
main (空)
{
WDTCTL = WDTPW | WDTHOLD; //停止看门狗计时器
//请求是针对50us (短周期)脉冲,但不是很长
//足够可靠地通过1MHz 的 ISR。
//下一个更高的校准速度是8MHz,所以我们使用它。
DCOCTL = CALDCO_8MHZ;
BCSCTL1 = CALBC1_8MHZ;
//计时器:P1.6=TA0.1上的 PWM (50%占空比、周期 SHORT 周期)
// SMCLK=8MHz、因此除以/8即可得到 timer_Hz=1MHz
short_cycles = 0;
P1SEL |= BIT2; // P1SEL.6=1设置 P1.6=TA0.1 [参考 SLAS735J 表19]
P1DIR |= BIT2; //将其设置为输出、因为计时器不会[另请参阅表19]
TA0CCR0 = SHORT 周期-1; //短周期时间(1MHz 周期)
TA0CCR1 = SHORT_PERIODE/2-1;// 50%占空比、无特殊原因
TA0CCTL1 = CCTL_OUTMOD|CCTL_OUT|CCIE; // OUTMOD_7、OUT=0、IE
TA0CTL = tassel_2 | ID_3 | MC_1 | TACLR;// SMCLK、/8、向上(、清除)
_EINT(); //启用 ISR
while (1)
{
LPM0; //这里没什么可做的
}
/*NOTREACHED*/
返回0;
}