写一段TL6748通过AD7606采集电压并通过串口输出的程序,且采样率可调,注释详细说明每一句程序的用途
时间: 2023-12-10 13:39:03 浏览: 128
以下是一段TL6748通过AD7606采集电压并通过串口输出的程序,采样率可调,注释详细说明每一句程序的用途:
```c
#include <msp430.h>
#define FREQ 1000000 //时钟频率为1MHz
#define BAUDRATE 9600 //串口波特率为9600bps
unsigned int freq_div = FREQ/BAUDRATE; //计算波特率发生器的除数
void config_UART(void)
{
P1SEL |= BIT1+BIT2; //P1.1为RXD,P1.2为TXD
P1SEL2 |= BIT1+BIT2;
UCA0CTL1 |= UCSSEL_2; //使用SMCLK作为串口时钟源
UCA0BR0 = freq_div & 0xFF;
UCA0BR1 = freq_div >> 8;
UCA0MCTL = UCBRS_0; //不使用调制
UCA0CTL1 &= ~UCSWRST; //使能串口
IE2 |= UCA0RXIE; //使能接收中断
}
void config_AD7606(void)
{
P1DIR |= BIT5; //P1.5为AD7606片选信号
P1OUT |= BIT5; //片选信号先置高
P3DIR &= ~BIT2; //P3.2为AD7606的BUSY信号输入
P3SEL &= ~(BIT0+BIT1); //P3.0和P3.1为AD7606的DIN和DOUT信号
P3DIR |= BIT0; //P3.0为AD7606的DIN信号输出
P3DIR &= ~BIT1; //P3.1为AD7606的DOUT信号输入
UCB0CTL1 |= UCSSEL_2; //使用SMCLK作为SPI时钟源
UCB0CTL0 |= UCMSB+UCMST+UCSYNC; //设置为主机模式,MSB先传输,同步传输
UCB0CTL1 &= ~UCSWRST; //使能SPI
}
unsigned int read_AD7606(void)
{
unsigned int result;
P1OUT &= ~BIT5; //拉低片选信号,选择AD7606
P3OUT &= ~BIT0; //先将DIN输出低电平
while(P3IN & BIT2); //等待BUSY信号变低,表示AD7606准备好了
UCB0TXBUF = 0xFF; //向AD7606发送8个时钟,将DIN与DOUT保持同步
while(!(IFG2 & UCB0RXIFG)); //等待接收完成
result = UCB0RXBUF & 0x0F; //接收到的结果只有低12位有效
UCB0TXBUF = 0xFF; //再次发送8个时钟,读取下一个通道的数据
while(!(IFG2 & UCB0RXIFG)); //等待接收完成
result = (result << 8) | UCB0RXBUF; //将前一个通道和当前通道的结果合并
P1OUT |= BIT5; //拉高片选信号,取消选择AD7606
return result; //返回12位结果
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; //关闭看门狗
DCOCTL = 0; //DCO控制字清零
BCSCTL1 = CALBC1_1MHZ; //设置时钟频率为1MHz
DCOCTL = CALDCO_1MHZ;
config_UART(); //配置串口
config_AD7606(); //配置AD7606
__bis_SR_register(GIE); //开启全局中断
while(1)
{
unsigned int data = read_AD7606(); //读取AD7606的数据
printf("%d\r\n", data); //通过串口输出数据
__delay_cycles(FREQ/1000); //延时一段时间,控制采样率
}
}
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
UCA0TXBUF = UCA0RXBUF; //将接收到的数据通过串口发送回去
}
```
程序主要分为三部分:串口配置、AD7606配置和主函数。
串口配置部分主要完成波特率的配置和使能串口的操作。在计算波特率发生器的除数时,使用了预定义的常量FREQ和BAUDRATE,分别表示时钟频率和串口波特率。在配置UCA0MCTL寄存器时,使用了预定义的常量UCBRS_0,表示不使用调制。
AD7606配置部分主要完成GPIO和SPI的配置。其中,P1.5为AD7606的片选信号,P3.2为AD7606的BUSY信号输入,P3.0和P3.1为AD7606的DIN和DOUT信号。UCB0CTL0寄存器的设置中,UCMSB表示MSB先传输,UCMST表示主机模式,UCSYNC表示同步传输。在读取AD7606数据时,需要向AD7606发送8个时钟(即发送0xFF),将DIN与DOUT保持同步。
主函数部分主要完成初始化、读取AD7606数据和通过串口输出数据的操作。在初始化时,关闭看门狗、设置时钟频率为1MHz,并调用config_UART()和config_AD7606()函数。在读取AD7606数据时,先拉低片选信号,等待BUSY信号变低,然后读取12位结果并合并前一个通道和当前通道的结果,最后拉高片选信号。在通过串口输出数据时,调用printf()函数输出数据并跟上回车换行符,然后延时一段时间,控制采样率。
最后,通过USCIAB0RX_VECTOR中断处理函数实现串口回环测试,将接收到的数据通过串口发送回去。
阅读全文