This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
MCU选用MSP430F5438A,系统主频为18.432MHz,adc采样保持源选用01 Timer_A.OUT1时,单片机无法采样,代码如下:
#include "msp430x54x.h"
__no_init int Volt[1200]; //ADC转换电压 40个周期
__no_init int Crrnt[1200]; //ADC转换电流 40个周期
int Jizhun[10];
int DMAcount;
void Init_DMA()
{
DMACTL0 = DMA0TSEL_24+DMA1TSEL_24; // ADC12IFGx triggered
DMACTL1 = DMA2TSEL_24;
DMACTL4 = DMARMWDIS; // Read-modify-write disable
DMA0CTL &= ~DMAIFG;
DMA1CTL &= ~DMAIFG;
DMA2CTL &= ~DMAIFG;
DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst, int
DMA1CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst,int
DMA2CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMAIE; // Rpt single tranfer, inc dst,
DMA0SZ = 1200; // DMA0 size = 12 00
DMA1SZ = 10;
DMA2SZ = 1200; // DMA2SZ = 1200;
__data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM13); // ... from ADC12MEM13
__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &Volt);
__data16_write_addr((unsigned short) &DMA1SA,(unsigned long) &ADC12MEM12); // ... from ADC12MEM14
__data16_write_addr((unsigned short) &DMA1DA,(unsigned long) &Jizhun);
__data16_write_addr((unsigned short) &DMA2SA,(unsigned long) &ADC12MEM15); // ... from ADC12MEM14
__data16_write_addr((unsigned short) &DMA2DA,(unsigned long) &Crrnt);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
P7SEL |= 0x03;
P5SEL |= 0x0C ; // 端口功能选择振荡器
UCSCTL6 &= ~XT2OFF ;
UCSCTL3 |= SELREF_2 ;
UCSCTL4 |= SELA_0 ;
do {
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG ;
}while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1 ; // XT2 驱动模式 24~32MHz
UCSCTL4 |= SELS_5 + SELM_5 ; // SMCLK = MCLK = XT2
//蓝色字体部分,系统时钟初始化,系统时钟18.432Mhz
P5SEL|=BIT0+BIT1;
P5DIR&=~(BIT0+BIT1); //ADC参考电压为外部参考电压3V
P7SEL |= BIT7+BIT4+BIT5 ; // Enable A/D channel A13,12,15
P8SEL|=BIT1;
P8DIR |= BIT1;
P6DIR|=BIT3;
_EINT();
Init_DMA();
TA0CCR0=4607;
TA0CCR1=4000;
TA0CCTL1 = OUTMOD_3; // Toggle on EQU1 (TAR = 0)
TA0CTL = TASSEL_2 + MC_1+TACLR; // SMCLK, cont-mode
ADC12CTL0 = ADC12SHT0_2 + ADC12ON ; // Config ADC12
ADC12CTL1 = ADC12SHS_1 + ADC12CONSEQ_3 +ADC12SHP+ADC12CSTARTADD_12; // TA trig., rpt conv.+ ADC12SHP
ADC12MCTL13 = ADC12SREF_2+ ADC12INCH_13 ; // Vr+=Vref+ and Vr-=AVss
ADC12MCTL12 = ADC12SREF_2+ ADC12INCH_12 ; // Vr+=Vref+ and Vr-=AVss
ADC12MCTL15 = ADC12SREF_2+ ADC12INCH_15 +ADC12EOS ; // Vr+=Vref+ and Vr-=AVss
ADC12CTL0 |=ADC12ENC;
while(1)
{ ; }
}
//////////////////DMA中断函数
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
{
switch(__even_in_range(DMAIV,16))
{
case 0: break;
case 2: break; // DMA0IFG = DMA Channel 0
case 4: break; // DMA1IFG = DMA Channel 1
case 6:
DMAcount=0;
P6OUT^=BIT3; // DMA2IFG = DMA Channel 2
case 8: break; // DMA3IFG = DMA Channel 3
case 10: break; // DMA4IFG = DMA Channel 4
case 12: break; // DMA5IFG = DMA Channel 5
case 14: break; // DMA6IFG = DMA Channel 6
case 16: break; // DMA7IFG = DMA Channel 7
default: break;
}
}
MCU选用MSP430F5438A,系统主频为18.432MHz,adc采样保持源选用03 Timer_B.OUT1时,单片机正常采样,并且正确,代码如下:
#include "msp430x54x.h"
__no_init int Volt[1200]; //ADC转换电压 40个周期
__no_init int Crrnt[1200]; //ADC转换电流 40个周期
int Jizhun[10];
int DMAcount;
void Init_DMA()
{
DMACTL0 = DMA0TSEL_24+DMA1TSEL_24; // ADC12IFGx triggered
DMACTL1 = DMA2TSEL_24;
DMACTL4 = DMARMWDIS; // Read-modify-write disable
DMA0CTL &= ~DMAIFG;
DMA1CTL &= ~DMAIFG;
DMA2CTL &= ~DMAIFG;
DMA0CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst, int
DMA1CTL = DMADT_4+DMAEN+DMADSTINCR_3; // Rpt single tranfer, inc dst,int
DMA2CTL = DMADT_4+DMAEN+DMADSTINCR_3+DMAIE; // Rpt single tranfer, inc dst,
DMA0SZ = 1200; // DMA0 size = 12 00
DMA1SZ = 10;
DMA2SZ = 1200; // DMA2SZ = 1200;
__data16_write_addr((unsigned short) &DMA0SA,(unsigned long) &ADC12MEM13); // ... from ADC12MEM13
__data16_write_addr((unsigned short) &DMA0DA,(unsigned long) &Volt);
__data16_write_addr((unsigned short) &DMA1SA,(unsigned long) &ADC12MEM12); // ... from ADC12MEM14
__data16_write_addr((unsigned short) &DMA1DA,(unsigned long) &Jizhun);
__data16_write_addr((unsigned short) &DMA2SA,(unsigned long) &ADC12MEM15); // ... from ADC12MEM14
__data16_write_addr((unsigned short) &DMA2DA,(unsigned long) &Crrnt);
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD ; // 关看门狗
P7SEL |= 0x03;
P5SEL |= 0x0C ; // 端口功能选择振荡器
UCSCTL6 &= ~XT2OFF ;
UCSCTL3 |= SELREF_2 ;
UCSCTL4 |= SELA_0 ;
do {
UCSCTL7 &= ~(XT2OFFG + XT1LFOFFG + XT1HFOFFG + DCOFFG); // 清除 XT2,XT1,DCO 错误标志
SFRIFG1 &= ~OFIFG ;
}while(SFRIFG1&OFIFG) ; // 检测振荡器错误标志
UCSCTL6 |= XT2DRIVE0 + XT2DRIVE1 ; // XT2 驱动模式 24~32MHz
UCSCTL4 |= SELS_5 + SELM_5 ; // SMCLK = MCLK = XT2
//蓝色字体部分,系统时钟初始化,系统时钟18.432Mhz
P5SEL|=BIT0+BIT1;
P5DIR&=~(BIT0+BIT1); //ADC参考电压为外部参考电压3V
P7SEL |= BIT7+BIT4+BIT5 ; // Enable A/D channel A13,12,15
P4SEL|=BIT1;
P4DIR |= BIT1;
P6DIR|=BIT3;
_EINT();
Init_DMA();
TB0CCR0=4607;
TB0CCR1=4000;
TB0CCTL1 = OUTMOD_3; // Toggle on EQU1 (TAR = 0)
TB0CTL = TBSSEL_2 + MC_1+TBCLR; // SMCLK, cont-mode
ADC12CTL0 = ADC12SHT0_2 + ADC12ON ; // Config ADC12
ADC12CTL1 = ADC12SHS_3 + ADC12CONSEQ_3 +ADC12SHP+ADC12CSTARTADD_12; // TA trig., rpt conv.+ ADC12SHP
ADC12MCTL13 = ADC12SREF_2+ ADC12INCH_13 ; // Vr+=Vref+ and Vr-=AVss
ADC12MCTL12 = ADC12SREF_2+ ADC12INCH_12 ; // Vr+=Vref+ and Vr-=AVss
ADC12MCTL15 = ADC12SREF_2+ ADC12INCH_15 +ADC12EOS ; // Vr+=Vref+ and Vr-=AVss
ADC12CTL0 |=ADC12ENC;
while(1)
{ ; }
}
//////////////////DMA中断函数
#pragma vector=DMA_VECTOR
__interrupt void DMA_ISR(void)
{
switch(__even_in_range(DMAIV,16))
{
case 0: break;
case 2: break; // DMA0IFG = DMA Channel 0
case 4: break; // DMA1IFG = DMA Channel 1
case 6:
DMAcount=0;
P6OUT^=BIT3; // DMA2IFG = DMA Channel 2
case 8: break; // DMA3IFG = DMA Channel 3
case 10: break; // DMA4IFG = DMA Channel 4
case 12: break; // DMA5IFG = DMA Channel 5
case 14: break; // DMA6IFG = DMA Channel 6
case 16: break; // DMA7IFG = DMA Channel 7
default: break;
}
}
问题:采样保持源选择timer时,timerA和timerB设置有什么不同吗?
01 Timer_A.OUT1
10 Timer_B.OUT0
11 Timer_B.OUT1