专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
430 方波问题
2019-03-24 11:38
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
14825
17
970
最近刚学习430 手上有F4250型号
想问问大家 能不能用430产生一个100K方波 然后实现相位平移呢?
或者哪位大虾可以提供以下思路,最好实现过。因为我初学有些算法还不能确定能不能做出来。
谢谢各位了 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
17条回答
wangfuchong
2019-03-26 07:56
本帖最后由 wangfuchong 于 2014-4-27 22:37 编辑
今天测试一些msp430以前有疑问未确定的特性,也就顺带写了段程序测试一下你这个问题
我用的是MSP430G2553简单型的单片机,不过TimerA应该是一样的,只不过内部CCR模块多少罢了
#include "io430.h"
//MSP430G2553
/* DCOCTL Calibration Data for 16MHz */
__no_init volatile unsigned __READ char CALDCO_16MHZ @ 0x10F8;
/* BCSCTL1 Calibration Data for 16MHz */
__no_init volatile unsigned __READ char CALBC1_16MHZ @ 0x10F9;
volatile signed char step=1;//控制移相步进,数值要小 ,否则会出错。最好也就是1,2,3之类 ,能多大要计算和试验
int main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
P1OUT = 0;
P1DIR = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
P1IES = 0;
P1IFG = 0;
P2OUT = 0;
P2SEL = BIT2 + BIT4;//定时器的TA1CCR1和TACCR2的输出,也就是输出两个方波的引脚
P2DIR = BIT0 + BIT1 + BIT2 + BIT3+BIT4 + BIT5 + BIT6 + BIT7;
P2IES = 0;
P2IFG = 0;
P3OUT = 0;
P3DIR = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
if (CALBC1_16MHZ != 0xFF)
{
DCOCTL = 0x00;
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
}
BCSCTL1 |= XT2OFF + DIVA_0;
BCSCTL3 = XT2S_0 + LFXT1S_2;
__delay_cycles(8000000);
__bis_SR_register(GIE);
TA1CCR0 =79;//MCLK=SMCLK=16MHz,所以定时器时钟也是16MHz,输出模式4,所以要多除以2
//TA1CCTL0=CCIE;
TA1CCTL1 = OUTMOD_4;
TA1CCR1 = 39;
TA1CCTL2=OUTMOD_4+CCIE;
TA1CCR2 = 39;
TA1CTL = TASSEL_2 + ID_0 + MC_1;
while(1)
{
__no_operation();
}
return 0;
}
#pragma vector=TIMER1_A1_VECTOR
__interrupt void TIMER1_A1_ISR_HOOK(void)
{
//static unsinged char step=1;//进入中断实际上定时器已经过了几个TACLK,因为TACLK等于MCLK,很快。所以CCRX加一个很小的数值应该不会引起突变
static unsigned char count=0;
static unsigned int countLong=0;//countLong仅仅是我为了在老旧模拟示波器上观看,用数字示波器可删除countLong及相关。
countLong++;
if(countLong>1000)
{
TA1CCR2+=step;
if(TA1CCR2>TA1CCR0)
{
if(step>0)
{
TA1CCR2=0;//TA1CCR2-TA1CCR0-1;
}
else if(step<0)
{
TA1CCR2=79;//TA1CCR2+TA1CCR0+1;
}
}
count++;
if(count>156)
{
if(step>0) step=-1;
else step=1;
count=0;
}
countLong=0;
}
TA1CCTL2&=~CCIFG;
}
复制代码
演示视频:
用模拟示波器演示了一下,没有数字示波器,用一个网上几十元的所谓逻辑分析仪看了一下,也没看到突变,不过您还得用数字示波器才能确定一下吧。点击图片可看大图放大
不知道您的应用是什么?我想一般在主程序中根据反馈设定step为-1,0,1即可吧?一般不需要多大的步进吧?
关键的要点就是:
进入中断实际上定时器已经过了几个TACLK,因为TACLK等于MCLK,很快。所以CCRX加一个很小的数值应该不会引起突变
加载中...
查看其它17个回答
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
今天测试一些msp430以前有疑问未确定的特性,也就顺带写了段程序测试一下你这个问题
我用的是MSP430G2553简单型的单片机,不过TimerA应该是一样的,只不过内部CCR模块多少罢了
- #include "io430.h"
- //MSP430G2553
- /* DCOCTL Calibration Data for 16MHz */
- __no_init volatile unsigned __READ char CALDCO_16MHZ @ 0x10F8;
- /* BCSCTL1 Calibration Data for 16MHz */
- __no_init volatile unsigned __READ char CALBC1_16MHZ @ 0x10F9;
- volatile signed char step=1;//控制移相步进,数值要小 ,否则会出错。最好也就是1,2,3之类 ,能多大要计算和试验
- int main( void )
- {
- // Stop watchdog timer to prevent time out reset
- WDTCTL = WDTPW + WDTHOLD;
-
- P1OUT = 0;
- P1DIR = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
- P1IES = 0;
- P1IFG = 0;
-
- P2OUT = 0;
- P2SEL = BIT2 + BIT4;//定时器的TA1CCR1和TACCR2的输出,也就是输出两个方波的引脚
- P2DIR = BIT0 + BIT1 + BIT2 + BIT3+BIT4 + BIT5 + BIT6 + BIT7;
- P2IES = 0;
- P2IFG = 0;
- P3OUT = 0;
- P3DIR = BIT0 + BIT1 + BIT2 + BIT3 + BIT4 + BIT5 + BIT6 + BIT7;
-
- BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0;
- if (CALBC1_16MHZ != 0xFF)
- {
- DCOCTL = 0x00;
- BCSCTL1 = CALBC1_16MHZ;
- DCOCTL = CALDCO_16MHZ;
- }
- BCSCTL1 |= XT2OFF + DIVA_0;
- BCSCTL3 = XT2S_0 + LFXT1S_2;
-
- __delay_cycles(8000000);
- __bis_SR_register(GIE);
-
- TA1CCR0 =79;//MCLK=SMCLK=16MHz,所以定时器时钟也是16MHz,输出模式4,所以要多除以2
- //TA1CCTL0=CCIE;
- TA1CCTL1 = OUTMOD_4;
- TA1CCR1 = 39;
- TA1CCTL2=OUTMOD_4+CCIE;
- TA1CCR2 = 39;
- TA1CTL = TASSEL_2 + ID_0 + MC_1;
-
- while(1)
- {
- __no_operation();
- }
-
- return 0;
- }
- #pragma vector=TIMER1_A1_VECTOR
- __interrupt void TIMER1_A1_ISR_HOOK(void)
- {
- //static unsinged char step=1;//进入中断实际上定时器已经过了几个TACLK,因为TACLK等于MCLK,很快。所以CCRX加一个很小的数值应该不会引起突变
- static unsigned char count=0;
- static unsigned int countLong=0;//countLong仅仅是我为了在老旧模拟示波器上观看,用数字示波器可删除countLong及相关。
- countLong++;
- if(countLong>1000)
- {
- TA1CCR2+=step;
- if(TA1CCR2>TA1CCR0)
- {
- if(step>0)
- {
- TA1CCR2=0;//TA1CCR2-TA1CCR0-1;
- }
- else if(step<0)
- {
- TA1CCR2=79;//TA1CCR2+TA1CCR0+1;
- }
- }
-
- count++;
- if(count>156)
- {
- if(step>0) step=-1;
- else step=1;
- count=0;
- }
- countLong=0;
- }
- TA1CCTL2&=~CCIFG;
- }
复制代码演示视频:
用模拟示波器演示了一下,没有数字示波器,用一个网上几十元的所谓逻辑分析仪看了一下,也没看到突变,不过您还得用数字示波器才能确定一下吧。点击图片可看大图放大
不知道您的应用是什么?我想一般在主程序中根据反馈设定step为-1,0,1即可吧?一般不需要多大的步进吧?
关键的要点就是:进入中断实际上定时器已经过了几个TACLK,因为TACLK等于MCLK,很快。所以CCRX加一个很小的数值应该不会引起突变
一周热门 更多>