专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
430 方波问题
2019-03-24 11:38
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
TI MCU
14767
17
970
最近刚学习430 手上有F4250型号
想问问大家 能不能用430产生一个100K方波 然后实现相位平移呢?
或者哪位大虾可以提供以下思路,最好实现过。因为我初学有些算法还不能确定能不能做出来。
谢谢各位了 此帖出自
小平头技术问答
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
17条回答
wangfuchong
1楼-- · 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加一个很小的数值应该不会引起突变
加载中...
wangfuchong
2楼-- · 2019-03-26 10:03
精彩回答 2 元偷偷看……
加载中...
walm2622
3楼-- · 2019-03-26 15:20
本帖最后由 walm2622 于 2014-4-28 14:08 编辑
wangfuchong 发表于 2014-4-27 22:29
我在13楼中说:比较输出是有延时好像
这个有错误,今天也测了这个,发掘没有。
简直~~~不知道说什么好!!
(略感动)总之非常感谢你花时间来帮我看程序!!这两天没怎么上论坛没有及时回复。
你给的资料我正在吸收,目前已经移植过来了。
用数字示波器观察 +=setp 来赋值暂时没发现突变,我之前用外部按键中断来修改setp值 不知道是不是在这个环节上出问题,等我再研究研究。
你15L那个实验很有趣,我平时使用时候很少在时延和语句引起的时间差的问题。
其实我之前使用翻转I/O的方法输出方波的时候,注意到在中断里面多添加一句语句,输出频率就会降低一些。也不知道用什么方法检测,也只是猜测,可能是执行一条语句的时候,计数器已经经过了很多个数了。
你测试的这些我平时都很少接触呢!而且我的手段很少,还得继续学习,弄明白这些对解决实际问题有很大的帮助啊,。
再次感谢你的回复,给我很大的启发。
加载中...
wangfuchong
4楼-- · 2019-03-26 19:20
本帖最后由 wangfuchong 于 2014-4-28 16:28 编辑
客气了 ,仅供参考,很可能有 错误的地方
您说移植,那可要仔细考虑行不行 呀
我想就是原理性 的能用 ,step就 设为1,因为方波频率 100K,也就是 中断频率也是 100K,已经 非常快了,调整到 需要 的移相幅度 也是很快的。
中断中代码尽量短,因为中断频率太高,而且主程序还要处理其它任务可能有其它中断占用时间,所以其它中断的运行时间(包括进入和退出中断的时间)也要短,理论上优先级比定时器高的所有中断加起来不能超过1/100K,这点要注意,很可能这种方式不能适合应用情况。
step=0时,可以不用再中断,关闭定时器中断,避免频繁中断。
因为这种方式不一定适合,所以也可以考虑其它方法,关键是新的CCR2值的设置位置(在0和CCR0之间)在哪里,相对于在设置时的TAR以及CCR1的位置!
加载中...
walm2622
5楼-- · 2019-03-26 21:39
精彩回答 2 元偷偷看……
加载中...
上一页
1
2
3
一周热门
更多
>
相关问题
相关文章
×
关闭
采纳回答
向帮助了您的网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
关闭
您已邀请
15
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
今天测试一些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加一个很小的数值应该不会引起突变
简直~~~不知道说什么好!!
你给的资料我正在吸收,目前已经移植过来了。
用数字示波器观察 +=setp 来赋值暂时没发现突变,我之前用外部按键中断来修改setp值 不知道是不是在这个环节上出问题,等我再研究研究。
你15L那个实验很有趣,我平时使用时候很少在时延和语句引起的时间差的问题。
其实我之前使用翻转I/O的方法输出方波的时候,注意到在中断里面多添加一句语句,输出频率就会降低一些。也不知道用什么方法检测,也只是猜测,可能是执行一条语句的时候,计数器已经经过了很多个数了。
你测试的这些我平时都很少接触呢!而且我的手段很少,还得继续学习,弄明白这些对解决实际问题有很大的帮助啊,。
再次感谢你的回复,给我很大的启发。
客气了 ,仅供参考,很可能有 错误的地方
您说移植,那可要仔细考虑行不行 呀
我想就是原理性 的能用 ,step就 设为1,因为方波频率 100K,也就是 中断频率也是 100K,已经 非常快了,调整到 需要 的移相幅度 也是很快的。
中断中代码尽量短,因为中断频率太高,而且主程序还要处理其它任务可能有其它中断占用时间,所以其它中断的运行时间(包括进入和退出中断的时间)也要短,理论上优先级比定时器高的所有中断加起来不能超过1/100K,这点要注意,很可能这种方式不能适合应用情况。
step=0时,可以不用再中断,关闭定时器中断,避免频繁中断。
因为这种方式不一定适合,所以也可以考虑其它方法,关键是新的CCR2值的设置位置(在0和CCR0之间)在哪里,相对于在设置时的TAR以及CCR1的位置!
一周热门 更多>