请问,在msp430f235 ,用12m的主时钟产生300khz的方波,并且是可以在输出10个方波之后保持输出高电平。保持精确性用定时器怎么去处理。
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
请问,在msp430f235 ,用12m的主时钟产生300khz的方波,并且是可以在输出10个方波之后保持输出高电平。保持精确性用定时器怎么去处理。
你好!
1、方波输出: 可以用f235的timer模块产生300khz的占空比为50%的PWM输出,并且每次比较器CCR触发的中断服务程序中进行计数,计数满10次后输出高电平;
2、输出高电平: 两种方法
a、到达10个计数值后,占空比改为100%
b、输出PWM的IO切换到GPIO,用GPIO置位,输出高电平
我是这样试过的,可是问题又产生啦,就是中断服务程序执行完之后,跳出不知道跳到哪里去啦?
中断服务程序执行完成,即返回到中断打断的程序的地方。
你是用什么触发中断?能否把代码贴出来。
#include<msp430f149.h>
unsigned int i;
void init_clk()
{
unsigned int iq0;
BCSCTL1 &=~ XT2OFF;
do{
IFG1 &=~ OFIFG;
for(iq0=0xff;iq0>0;iq0--);
}
while((IFG1 & OFIFG)!= 0);
BCSCTL2 |= SELM_2 + SELS;
}
void timer_a0(void)
{
P1SEL |= BIT1 + BIT5;
P1DIR |= BIT1 + BIT5;
TACCTL0 = CCIE+ OUTMOD_4;
TACCR0 = 20;
_EINT();
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
i=0;
init_clk();
P5SEL |= BIT4;
P5DIR |= BIT4;
P6DIR |= BIT1 + BIT2;
P6OUT |= BIT1 + BIT2;
TACTL = TASSEL_2 + MC_2;
timer_a0();
while(1)
{
}
}
#pragma vector = TIMERA0_VECTOR
__interrupt void timera0_isr(void)
{
CCR0 += 20;
i++;
P1OUT ^= BIT1;
if(i==10)
{
i=0;
P1SEL &=~ BIT1;
P1OUT |= BIT1;
CCTL0 &=~ CCIE;
}
}
你好!
初始化部分:
1,IO设置配置成外设TA1、输出;
2、设置CCTL0使能CCR0中断;设置CCR0值,这个值决定了PWM的周期;
3、设置CCTL1模式为模式7,reset/set;设置CCR1值,为CCR0值的1/2;
4、设置TACTL,选择时钟,upmode;
CCR0中断部分:
1、计数;
2、如果满10次后,占空比设置为100%
调试的步骤就是这样来的,可是还是不理想,我是这样的,中断服务程序里面当计数满10次之后,我就让CCR1的值等于CCR0的值,可是得到的波形就是在最后出高电平的时候总会周期性的有一个很短时间的低电平,不知道什么原因。
让CCR1的值 比 CCR0 大, 例如 CCR1 = CCR0 + 1;
其它正常了吗?
问题是解决啦,得到的波形很漂亮,可是这样一来我就只能用ta1输出,不能用ta0输出啦,我还得改硬件的设置,不过这个问题算是解决啦,谢谢。
以下是我用msp430f149产生的10个400khz的方波的程序
#include<msp430f149.h>
unsigned int i;
void int_clk()
{
unsigned int iq0;
BCSCTL1 &=~XT2OFF; //打开时钟振荡器
do
{
IFG1 &= ~OFIFG; // 清除振荡器失效标志
for (iq0 = 0xFF; iq0 > 0; iq0--); // 延时,等待XT2起振
}
while ((IFG1 & OFIFG) != 0); // 判断XT2是否起振
BCSCTL2 |=SELM_2 + SELS; //MCLK,SMCLK时钟为XT2
}
void timera0(void)
{
TACCTL0 |= CCIE;
TACCR0 = 20; //设置TACCR0的值
}
void timera1(void)
{
P1SEL |= BIT2;
P1DIR |= BIT2;
TACCTL1 |= OUTMOD_7; //选择输出模式7
TACCR1 = 10;
}
void main()
{
WDTCTL = WDTPW + WDTHOLD;
int_clk();
TACTL = TASSEL_2 + MC_1;
timera1();
timera0();
_EINT();
while(1);
}
#pragma vector = TIMERA0_VECTOR
__interrupt void timera0_isr(void)
{
i++;
if(i==10)
{
TACCR1 = 21;
CCTL0 &=~ CCIE; //跳出中断.
}
}
恭喜楼主,感谢你的肯定和分享,欢迎继续提问~
也可以用另一个思路,使用upmode获得了600khz的中断,在中断中,toggle IO 输出 占空比 为 50% 的方波,计数停止。
这个方法我很早以前就试过啦,就是得到的效果不理想,我还想过用pwm+捕捉去实现,可是还是把问题想复杂啦。后面又用了我前面用的程序,我不知道为什么会出现调处中断却不知道跳到哪去啦的状态。您能帮我分析分析我的那个程序的问题吗?