大家好,团队
客户提出的问题可能需要您的帮助:
2 kHz 正弦信号由信号源产生1 V 幅度,然后通过 MSP430G2553的 ADC10获得信号,并通过 UART 将采集的数据发送到 MATLAB 以恢复波形。 但恢复的信号总是出现故障(有时还可以)。 客户想知道该计划有什么问题吗? (来自源的信号准确且已测试)。
下图显示了故障的两种情况:
正常值如下所示:
#include <MSP4C.h>
#include "stdint.h"
#define nn 100;
UINT16_t adcbuy[100]={0};// nn 长度的数组
UINT8_t combuy[20]={0};//用于保存串行端口接受的命令
UINT8_t iscomend =0 ;//end of command? 用于确定是否已成功收到完整的命令
/**
*主要
*
使 InitSystemClock 无效(void)
{
DCOCTL = CALDCO_16MHz;
BCSCTL1 = CALBC1_16MHz;
BCSCTL2和=~;//选择 SMCLK 的来源
BCSCTL2 &=~(DIVS0 | DIVS1);//设置除数
}
作废 InitUART (作废)
{
UCA0CTL1 |= UCSWRST;//set UCSWRST
//初始化所有 UCSI 寄存器
UCA0CTL0 &=~(UCMODE1 | UCMODE0);//将 UCSI 模式00配置为 UART 模式
UCA0CTL0和=~UCSYNC;//选择异步模式
UCA0CTL1 |=(UCSSEL1 | UCSSEL0);//将时钟源10和11配置为 SMLCK
//配置波特率,查看 UCOS16,然后在用户手册中查找表15.4 UCBRx UCBRSx UCBRFx 最后两个实际位于 UCAxMCTL 中
UCA0BR0=0x82;
UCA0BR1=0x06;
UCA0MCTL |=(UCBRS1| UCBRS2);
//配置端口
P1SEL |= BIT1 + BIT2;
P1SEL2 |= BIT1 + BIT2;
//清除重置以启用 UART
UCA0CTL1 &=~UCSWRST;
IE2 |= UCA0RXIE;//打开串行端口的接收中断
IFG2和=~UCA0RXIFG;//清除接收中断标志
}
无效 InitADCTrigByTimerA (void)
{
ADC10CTL1 |= ADC10SSEL_2;//选择时钟源
ADC10CTL1 |= SHS0;//选择计时器 A OUT1 SHSx 进行采样,并为 Timer_A OUT1 00保留源01 (用于 ADC10SC 位)
ADC10CTL1 || CONSEQ1;//选择转换序列00至单通道单转换01至通道序列
ADC10CTL0 |= SREF_1;//set the reference,external or internal?(ADC10CTL0 |= SREF_1;//set the reference,外部还是内部?)
ADC10CTL0 |= ADC10SHT_1;//将 ADC10样本保持时间设置为16 CLK
ADC10CTL0和=~ADC10SR;//ADC10采样率
ADC10CTL0 |= Ref2_5V;//ADC 参考选择2.5 V
ADC10CTL0 |= REFON;//Turn on the reference (打开参考)
ADC10CTL1 |= inch_4;//选择 ADC 输入通道 A4
ADC10AE0 |= 1 <4;//允许 A4模拟输入
//DTC 传输模式
ADC10DTC0 |= ADC10CT;//at 1,数据将持续传输,并且只有在清除 ADC10CT 或写入 ADC10SA 时,DTC 才会停止运行
ADC10DTC1 = nn;//传输总数为50
ADC10SA =(uint16_t)(adcbuff);//ADC10SA 确定起始地址,该地址强制 adcbuff 的第一个地址为16位整数
/*打开 ADC*/
ADC10CTL0 |= ADC10ON;
/*允许转换*/
ADC10CTL0 |= ENC;
}
无效 InitTimerA()
{
TA0CTL |=TASSSEL1;//配置时钟位 SMLCk
TA0CTL |= MC0;// UP 模式,01为 up,向上为 TA0CCR0,10为连续模式,计时器计数为0FFFFh
//11升/降模式是计时器增加到 TCCR0,然后降低到0000h
TA0CCR0 =0x004F;//配置 TA0CCR0位0x004F
TA0CCR1= 0x002F;//设置占空比(TACCR0-TACR1)/TARRC0此时,占空比为1/2,频率= SMCLK/(TACCR0+1)/2 SMCLK 在时钟中设置。 例如,16 MHz/80/2大约为100 k,大约是采样频率和最大采样频率
TA0CCTL0和=~盖;
TA0CCTL1和=~盖;
TA0CCTL1 |= OUTMOD_6;
//设置 IO 多路复用
P1SEL |= BIT6;//
P1DIR |= BIT6;//
}
Int main (无效)
{
UINT16_t cnt = 0;
WDTCTL = WDTPW | WDTHOLD;//停止看门狗计时器
InitSystemClock();
InitUART();
InitADCTrigByTimerA();
InitTimerA();
__bis_SR_register (GIE);//打开全局中断
While (1)(同时)
{
IF (等结束)
{
等式=0;
对于(cnt = 0; cn<100;cnt ++)
{
While (UCA0STAT 和 UCBUSY);
UCA0TXBUF=*(adcbuy+cnt)/256;// adcbuys 中的数据被发送出去,先是8位高
__delay_cycles (30000);
While (UCA0STAT 和 UCBUSY);
UCA0TXBUF=*(adcbuy+cnt)%256;//然后降低8位
__delay_cycles (30000);
}
}
}
返回0;
}
#pragma vector = USAISCB0RX_vector
中断 void UART_receive_ISR (void)
{
静态 uint8_t cnt2=0;
如果(IFG2和 UCA0RXIFG)//检测接收中断是否为 USCI_A0,并且接收中断与 USCI_A0和 USIC_B0共享相同的量
{
IFG2和=~UCA0RXIFG;//清除标志位
combuy[cnt2++]= UCA0RXBUF;//保存命令
cnt2 %=20;//防止 cnt 大于20,导致缓冲区溢出
如果(combuy[cnt2 - 1]='#')//如果检测到命令结束字符(带'#'的命令结束)
{
cnt2 = 0;//重置计数器
iscomend = 1;//收到命令
}
}
}
注意: 这等同于使用 G2553作为示波器。
请帮您检查此案例? 谢谢。
此致,
樱桃