MSP-EXP430FR5739: ADC10B Sequenz mit PWM triggern

Der ADC10B des MSP430 kann auch automatisch mehrere Kanäle nacheinander messen, ohne dass manuell hin und her geschaltet werden muss.
Das folgende Programm misst zunächst Kanal A1 und dann A0. Der ADC fängt immer beim höchsten in ADC10MCTL0 eingestellen Kanal an und zählt dann herunter. Nach jeder Messung wird in diesem Programm ein Interrupt ausgelöst und der gerade gemessene Wert kann ausgelesen werden.

[c]
#include „msp430fr5739.h“

unsigned int ADC_Result;

void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT

// Setup clock system
CSCTL0_H = 0xA5; // Password
CSCTL1 |= DCOFSEL0 + DCOFSEL1; // DCO 8 MHz
CSCTL2 = SELA_3 + SELS_3 + SELM_3; // set ACLK = SMCLK = DCO/8

// Port Setup
P1SEL0 |= BIT0; // P1.0 is input for ADC
P1SEL1 |= BIT0; // Channel A0
P1SEL1 |= BIT1; // P1.1 is input for ADC
P1SEL0 |= BIT1; // Channel A1

// Setup Timer
TA0CCR0 = 20000 – 1; // PWM Period 50 Hz
TA0CCTL1 = OUTMOD_7; // CCR1 reset/set
TA0CCR1 = 2000; // CCR1 PWM duty cycle 10 %
TA0CTL = TASSEL_2 + MC_1 + TACLR; // SMCLK, up mode, clear TAR

// Setup ADC
ADC10CTL0 &= ~ADC10ENC;
ADC10CTL0 |= ADC10SHT_2 + ADC10ON; // ADC10ON, S&H=16 ADC clks
ADC10CTL1 |= ADC10CONSEQ_3; // Repeat-Sequence-of-Channels Mode
ADC10CTL1 |= ADC10SHS_1; // Set PWM as trigger source
ADC10CTL1 &= ~ADC10SHP; // Bypass Sample timer
ADC10CTL2 |= ADC10RES; // 10-bit conversion results
ADC10MCTL0 |= ADC10INCH_1; // Start Sequence with Channel A1
ADC10IE |= ADC10IE0; // Enable ADC conv complete interrupt
ADC10CTL0 |= ADC10ENC; // Enable ADC conversation

_BIS_SR(GIE);

while(1) __bic_SR_register(CPUOFF);
}

#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
{
__no_operation();
switch(__even_in_range(ADC10IV,12))
{
case 0: break; // No interrupt
case 2: break; // conversion result overflow
case 4: break; // conversion time overflow
case 6: break; // ADC10HI
case 8: break; // ADC10LO
case 10: break; // ADC10IN
case 12:
ADC_Result = ADC10MEM0;
__no_operation();
__bic_SR_register_on_exit(CPUOFF);
break;

default: break;
}
}
[/c]

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert