📄 fg439_pwm_adc.c
字号:
// MSP430xG439 software ADC demo
//
// Description: This codes generates a PWM signal, and adjusts its ratio until a heavily low pass
// filtered version of the signal (i.e. its equivalent DC value) matches a DC signal to
// be measured. The match is detected using comparator A.
//
//
// T.I. T.I.
// MSP430xG43x MCU STK/EVK 6.5 digit 4 mux LCD
// #T218010
// --------------- --------------
// | COM3 |-----|2 COM4 |
// | COM2 |-----|1 COM3 |
// | COM1 |-----|3 COM2 |
// | COM0 |-----|4,20 COM1 |
// | SEG0 |-----|19 |
// | SEG1 |-----|18 |
// | SEG2 |-----|17 |
// signal to be measured-->|CA1 SEG3 |-----|16 |
// | SEG4 |-----|15 |
// +-470k-|P2.0 SEG5 |-----|14 |
// | | SEG6 |-----|13 |
// +----- |CA0 SEG7 |-----|12 |
// | | SEG8 |-----|11 |
// ===.047 | SEG9 |-----|10 |
// | | SEG10|-----|9 |
// ------ |VSS SEG11|-----|8 |
// | SEG12|-----|7 |
// | SEG13|-----|6 |
// | SEG14|-----|5 (bits C,E,H |
// | | | of digit 7)|
// | | --------------
// | XIN|-
// | | 32768
// | XOUT|-
// | |
// ---------------
//
// Vincent Chan
// Texas Instruments, Inc
// Aug 2002
#include <msp430xG43x.h>
#define SEG_a 0x01
#define SEG_b 0x02
#define SEG_c 0x10
#define SEG_d 0x04
#define SEG_e 0x80
#define SEG_f 0x20
#define SEG_g 0x08
#define SEG_h 0x40
//By changing the about definitions appropriately, the follow
//definitions are generic, and may be used for most byte
//addressed displays.
//First blank, and the hex codes, which all display quite
//well on a 7-segment display.
#define CHAR_SPACE 0
#define CHAR_ALL (SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g|SEG_h)
#define CHAR_0 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f)
#define CHAR_1 (SEG_b|SEG_c)
#define CHAR_2 (SEG_a|SEG_b|SEG_d|SEG_e|SEG_g)
#define CHAR_3 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_g)
#define CHAR_4 (SEG_b|SEG_c|SEG_f|SEG_g)
#define CHAR_5 (SEG_a|SEG_c|SEG_d|SEG_f|SEG_g)
#define CHAR_6 (SEG_a|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_7 (SEG_a|SEG_b|SEG_c)
#define CHAR_8 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_9 (SEG_a|SEG_b|SEG_c|SEG_d|SEG_f|SEG_g)
#define CHAR_A (SEG_a|SEG_b|SEG_c|SEG_e|SEG_f|SEG_g)
#define CHAR_B (SEG_c|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_C (SEG_a|SEG_d|SEG_e|SEG_f)
#define CHAR_D (SEG_b|SEG_c|SEG_d|SEG_e|SEG_g)
#define CHAR_E (SEG_a|SEG_d|SEG_e|SEG_f|SEG_g)
#define CHAR_F (SEG_a|SEG_e|SEG_f|SEG_g)
char digit[10] =
{
CHAR_0, // "0" LCD segments a+b+c+d+e+f
CHAR_1, // "1"
CHAR_2, // "2"
CHAR_3, // "3"
CHAR_4, // "4"
CHAR_5, // "5"
CHAR_6, // "6"
CHAR_7, // "7"
CHAR_8, // "8"
CHAR_9 // "9"
};
extern int Meas_ADC(void);
void main(void)
{
char *LCD = LCDMEM;
unsigned int i;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
SCFI0 |= FN_2; // x2 DCO, 4MHz nominal DCO
FLL_CTL0 = XCAP18PF; // set load capacitance for xtal
SCFQCTL = 74; // (74+1) x 32768 = 2.45Mhz
P1DIR = 0xE7; // All P1.x outputs
P1OUT = 0; // All P1.x reset
P2DIR = 0x00; // All P2.x outputs
P2OUT = 0; // All P2.x reset
P3DIR = 0xFF; // All P3.x outputs
P3OUT = 0; // All P3.x reset
P4DIR = 0xFF; // All P4.x outputs
P4OUT = 0; // All P4.x reset
P5DIR = 0xFF; // All P5.x outputs
P5OUT = 0; // All P5.x reset
P6DIR = 0xFF; // All P6.x outputs
P6OUT = 0; // All P6.x reset
CACTL2 = P2CA0 | P2CA1; // P2.3+ P2.4-
CAPD |= CAPD7 | CAPD6; // disable the input buffer the pins
// associated with CA0 (P1.6) and CA1 (P1.7)
// so large current will not flow through
// the CMOS tansistors.
// Initialize the LCD driver (4Mux mode)
LCDCTL = LCDSG0_3 | LCD4MUX | LCDON; // 4-Mux LCD, segments S0-S23
P5SEL = BIT7 | BIT6 | BIT5 | BIT4 | BIT3 | BIT2; // Select P5.2-7 as Com and Rxx
// Clear the LCD memory to clear display
for (i = 0; i < 12; i++)
LCD[i] = 0;
BTCTL = BT_fLCD_DIV64 | BT_fCLK2_DIV128 | BT_fCLK2_ACLK_DIV256;
BTCTL = BT_ADLY_0_5;
IE2 |= BTIE; // Enable BT interrupt
P2DIR |= BIT0; // Enable ADC PWM DAC output
P6SEL |= BIT7;
P6DIR |= BIT7;
ADC12CTL0 = ADC12ON | MSC | SHT0_4 | REFON | REF2_5V; // Turn on the ADC12, and set the sampling time
/* Configure the DAC to generate an output level which we can measure using the
soft-ADC. */
DAC12_1CTL = DAC12CALON | DAC12IR | DAC12AMP_7 | DAC12ENC;
DAC12_1DAT = 0x800;
_EINT();
for (;;)
{
_BIS_SR(LPM3_bits); // Enter LPM3
_NOP();
}
}
#pragma vector=BASICTIMER_VECTOR
__interrupt void basictimer_interrupt(void)
{
char *LCD = LCDMEM;
unsigned int i;
int ADC_sum;
/* Average 4 readings */
ADC_sum = 0;
ADC_sum += Meas_ADC();
ADC_sum += Meas_ADC();
ADC_sum += Meas_ADC();
ADC_sum += Meas_ADC();
ADC_sum >>= 2;
/* Display the average reading */
for (i = 0; i < 5; i++)
{
LCD[i] = digit[ADC_sum%10]; // remainder = character in table to display
ADC_sum = ADC_sum/10; // shifts right so next character can be displayed
}
LCD[3] |= SEG_h; // Add the decimal point
/* Step the DAC output level, wrapping to zero at full scale. */
DAC12_1DAT = (DAC12_1DAT + 1) & 0xFFF;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -