msp430工作笔记3
(一),频率计的设计
2,测周法:
(1)可以使用定时器的输入捕获功能,捕获上升沿或下降沿,然后就可以计算出信号的周期,从而得出频率。
(2)也可以把待测信号接到IO上,然后用无限循环不停的查询电平的高低,从而得出信号的周期。丁老师建议:以丁老师的经验,这种方法测量的精度比用捕获中断的精度要高,因为中断的进入和退出都要占用时间。
(3)但这种侧周法适用于低频信号频率的测量,对于高频信号精度不好。
3,测频法:
4,等精度测频:
(2) 如果Timer0_A用于其他用途的话,也可以接一个计数器,然后把计数值在输入给单片机(如小车上测速所采用的方法)。
(3) 目前这个方案还在完善中,但初步试验表示,精度可以达到很高(10的-4以上)
(二),DAC0832的使用
电路如下:
其中0832工作于单缓冲模式,输入寄存器受控,DAC寄存器直通
一个基本的0832控制程序如下:
#include msp430g2553.h>
#define uint unsigned int
#define uchar unsigned char
//dac0832 pin define
#define CS_SET P2OUT |= BIT6
#define CS_CLR P2OUT &= ~BIT6
#define WR_SET P2OUT |= BIT7
#define WR_CLR P2OUT &= ~BIT7
#define DI P1OUT
//1延时
//#define CPU_F ((double)16000000)//cpu frequency16000000
#define CPU_F ((double)1000000)//cpu frequency1000000
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
void write_dac(uint data)
{
CS_CLR;
DI = data;
WR_CLR;
delay_us(1);
WR_SET;
CS_SET;
}
void IO_init()
{
P1DIR = 0xff;
}
void DCO_init()
{
}
void main(void)
{
// uint adc_data=0;
WDTCTL = WDTPW + WDTHOLD;
IO_init();
DCO_init();
write_dac(0xff);
for(;;)
{
write_dac(0xff);
delay_ms(1);
write_dac(0xc0);
delay_ms(1);
write_dac(0x7f);
delay_ms(1);
write_dac(0x3f);
delay_ms(1);
write_dac(0x00);
delay_ms(1);
}
}
#include
#include "ser_12864.h"
//dac0832 pin define
#define CS_SET P2OUT |= BIT6
#define CS_CLR P2OUT &= ~BIT6
#define WR_SET P2OUT |= BIT7
#define WR_CLR P2OUT &= ~BIT7
#define DI P1OUT
uint key=0;
uchar s_step[]=
uchar s_sin[] =
uchar s_square[]=
uchar s_saw[]=
uchar s_triangular[]={"triangular"};
const uchar sin_a[256]={0x80,0x83,0x86,0x89,0x8c,0x8f,0x92,0x95,0x98,0x9c,
msp430工作笔 相关文章:
- msp430工作笔记二(11-13)
- msp430工作笔记4(11-13)
- MSP430 工作笔记一(转)(11-13)
- Windows CE 进程、线程和内存管理(11-09)
- RedHatLinux新手入门教程(5)(11-12)
- uClinux介绍(11-09)