SparkFun Forums 

Where electronics enthusiasts find answers.

Discussions on how to get your MSP JTAG programmer up and running.
By err0r
#108063
Hello all. I was just wondering if someone can help post some tips for my project. My project involves a flex sensor (potentiometer that ranges from 60k to 100k ohms). Using external circuitry to send various voltage levels (from changes in the potentiometer) to the micro. I want to perform ADC on these voltage readings (0-2V). Then based on these voltage readings I want to implement PWM to drive a servo. The servo can function between 600us to 2400us.

I want to set it up such that:
  • 100k ohms (no flex) will drive the servo at 600us.
  • 85k ohms (mid flex) will drive the servo at 1500us
  • 60k ohms (max flex) will drive the servo at 2400us
In addition to these settings, I want every resistance in-between (the entire range of 60k-100k). One of my main problems is that I don't know how to direct the reading from ADC (what port does that reading comes in on?) to begin PWM? Also, I'm not sure how to setup PWM. I know it involves timers but I don't know much more than that.

Any/all help is much appreciated.

Also, below is my setup code for ADC. Comments appreciated on this as well.
Code: Select all
#include <MSP430xg46x.h>
#include "intrinsics.h"
#include "io430.h"
#include "header_file.h"

//--- MAIN ---//
int main (void)
{
  WDTCTL = WDTPW | WDTHOLD;                                                    // Stop watchdog
  
//--- ADC --//
  ADC12CTL0 = ADC12ON | REFON | REF2_5V | SHT0_7;                              // ADC12ON = enables ADC12
                                                                               // REFON = enables reference voltage (for testing purposes)
                                                                               // REF2_5V = 2.5 reference voltage
                                                                               // SHT0_7 = 2^7 = 128 cycles
  
  ADC12CTL1 = SHS0 | SHP | ADC12DIV0 | ADC12SSEL0 | CONSEQ0 ;       
                                                                               // SHS0 = ADC12OSC internal timer bit
                                                                               // SHP = Sample/Hold Pulse Mode  
                                                                               // ADC12DIV0 = No clock divisions
                                                                               // ADC12SSEL0 = ADC12OSC as source
                                                                               // CONSEQ0 = Single-channel single-conversion
  
  ADC12IE   = BIT0;                                                            // Enable interrupt on bit0
  ADC12MEM0 = ZERO;                                                            // Clear mem
  
  asm (" EINT");                                                               // Enable global interrupts
  
}