Jump to content
43oh

kenemon

Members
  • Content Count

    275
  • Joined

  • Last visited

  • Days Won

    2

Reputation Activity

  1. Like
    kenemon reacted to MattTheGeek in stepper motor code   
    See Output section 6 in http://www.picaxe.com/docs/picaxe_manual3.pdf
  2. Like
    kenemon reacted to zeke in stepper motor code   
    Jones stepper motor tutorials seems to be the goto source of info.
  3. Like
    kenemon reacted to zeke in How to solder this?   
    Just add isopropyl alcohol and it will liquefy again. Easy Peasy.
  4. Like
    kenemon reacted to gwdeveloper in Launchpad TB6612FNG Motor Driver   
    KB, hardware wise you should be able to output 3 PWM channels on the 20 pin MSP430G2553 since it has 2 TimerA peripherals but no pin access for TA0.2. The 3 channels could be output on TA0.1, TA1.1 and TA1.2. You have P1.2 and P2.2 correct, TA1.2 is output on P2.4 and P2.5. If you really need 4 hardware PWM channels, you'll need to go to the 28pin version of the G2553. It has TA0.2 available on P3.0 and P3.6.
     
    That aside, you only need to use the timer pins you want to output the PWM on. For eg, to use TA0.1, you output your PWM on P1.2 but you can use P1.1 and P1.0 as GPIO or their other functions. Unless, you're wanting to output those TimerA signals.
     
    Also, somewhere on the web, I've seen 'bit-banging' pwm for the msp430 to get more channels out of the LP.
     
    Hope that all makes sense.
  5. Like
    kenemon got a reaction from zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    Thanks for all the help Zeke. They turned out beautiful....
     

     

  6. Like
    kenemon got a reaction from boseji in Launchpad as external programmer   
    don't worry, i am not that advanced. Your reply is what I was looking for. In CCS, I cant find these??
     
     
     

     
    but I found the debugger setting you mentioned in IAR:
     

     
     
    I cant find the "programmer" you mentioned. Can you point me closerI think this is what I needed. Much Thanks....
  7. Like
    kenemon reacted to gwdeveloper in Launchpad TB6612FNG Motor Driver   
    I've created a simple program to use the Toshiba TB6612FNG motor driver (http://www.sparkfun.com/products/9457) with the MSP430. Currently, I have it configured for use on the MSP430G2553 on the Launchpad. It uses PWM output from TA0 for the left motor driver and TA1 for the right motor drive. This code is set for 50% duty cycle. 20% is the lowest speed, 100% is the fastest. Anything less than 20% duty cycle just causes the motors to whine. Of course that may vary based on motor selection and power input. The on-board button at P1.3 is used to start and stop the function for now.
    Make sure to follow the data sheet for connections. http://www.semicon.toshiba.co.jp/docs/datasheet/en/LinearIC/TB6612FNG_en_datasheet_080509.pdf Vcc connects to the Launchpad's vcc pin and Vm connects to the motor's power source.
     

    /****************************************************************/ /* Greg Whitmore */ /* greg@gwdeveloper.net */ /* www.gwdeveloper.net */ /****************************************************************/ /* released under the "Use at your own risk" license */ /* use it how you want, where you want and have fun */ /* debugging the code. */ /* MSP430G2553 */ /****************************************************************/ #include // TB6612FNG defines #define AIN1 BIT1 // P1.1 #define AIN2 BIT0 // P1.0 #define BIN1 BIT0 // P2.0 #define BIN2 BIT1 // P2.1 #define STANDBY BIT6 // P1.6 // button status unsigned char buttonOn; // prototype drive functions void forward(void); void reverse(void); void full_brake(void); void stop(void); void main(void) { WDTCTL = WDTPW + WDTTMSEL + WDTSSEL + WDTIS1; // WDT as interval timer for debouncing of P1.3 button // interval mode, low speed clock, /512 // enable button on P1.3 with interrupt P1OUT = BIT3; P1REN = BIT3; P1IES = BIT3; P1IE = BIT3; P1IFG = 0; // clear P1 interrupt flags // rest of gpio for motor output P1SEL = BIT2; // select TimerA0.1 PWMA output P1DIR = BIT0 + BIT1 + BIT2 + BIT6; // set P1 output bits for AIN1, AIN2 and STANDBY P2SEL = BIT2; // select TimerA1.1 PWMB output P2SEL &= ~(BIT6 + BIT7); // turn off xtal P2DIR = BIT0 + BIT1 + BIT2; // set P2 output bits for BIN1, BIN2 BCSCTL2 = SELM_0 + DIVM_0 + DIVS_0; DCOCTL = 0x00; // clear DCO bits BCSCTL1 = CALBC1_1MHZ; // Set DCO to calibrated 1MHz DCOCTL = CALDCO_1MHZ; BCSCTL1 |= XT2OFF + DIVA_0; BCSCTL3 = XT2S_0 + LFXT1S_2 + XCAP_1; IFG1 &= ~(WDTIFG); // clear WDT flags IE1 |= WDTIE; // enable WDT interrupt // left motor pwm configuration; adjust TA0CCR1 for speed, less than 20% = no motor power TA0CCTL1 = CM_0 + CCIS_0 + OUTMOD_7; // no capture, PWM reset/set TA0CCR0 = 511; TA0CCR1 = 255; // 50% duty cycle TA0CTL = TASSEL_2 + ID_0 + MC_1; // SMCLK, /1, up mode // right motor pwm configuration; adjust TA1CCR1 for speed, less than 20% = no motor power TA1CCTL1 = CM_0 + CCIS_0 + OUTMOD_7; // no capture, PWM reset/set TA1CCR0 = 511; TA1CCR1 = 255; // 50% duty cycle TA1CTL = TASSEL_2 + ID_0 + MC_1; // SMCLK, /1, up mode buttonOn = 0; __enable_interrupt(); // Set global interrupt enable forward(); // enable forward bits for testing, replace with reverse function //reverse(); while (1) { LPM0; // turn CPUOFF and keep it there } } // both motors forward; AIN1 low, AIN2 high, BIN1 high, BIN2 low // use TA0.1 & TA1.1 PWM to control speed void forward(void) { P1OUT |= AIN2; P1OUT &= ~AIN1; P2OUT &= ~BIN2; P2OUT |= BIN1; } // both motors reverse; AIN1 high, AIN2 low, BIN1 low, BIN2 high // use TA0.1 & TA1.1 PWM to control speed void reverse(void) { P1OUT |= AIN1; P1OUT &= ~AIN2; P2OUT &= ~BIN1; P2OUT |= BIN2; } // both motors brake; all high void full_brake(void) { P1OUT |= AIN1; P1OUT |= AIN2; P2OUT |= BIN1; P2OUT |= BIN2; } // both motors stop; all low void stop(void) { P1OUT &= ~AIN1; P1OUT &= ~AIN2; P2OUT &= ~BIN1; P2OUT &= ~BIN2; } #pragma vector=PORT1_VECTOR __interrupt void button_push_isr(void) { P1IFG &= ~BIT3; // clear P1.3 button flag P1IE &= ~BIT3; // clear P1.3 interrupt IFG1 &= ~WDTIFG; WDTCTL = (WDTCTL & 7) + WDTCNTCL + WDTPW + WDTTMSEL; IE1 |= WDTIE; // use button to toggle motors on/off for testing if (buttonOn == 1) { buttonOn = 0; P1OUT &= ~STANDBY; // motor driver disable } else { buttonOn = 1; P1OUT |= STANDBY; // motor driver enable } } #pragma vector=WDT_VECTOR __interrupt void watchdog_isr(void) { IE1 &= ~WDTIE; P1IFG &= ~BIT3; // clear P1.3 button flag P1IE |= BIT3; // re-enable P1.3 interrupt }
    We're going to use this as part of our line-follower project. http://www.43oh.com/forum/viewtopic.php?f=9&t=1701
  8. Like
    kenemon reacted to gwdeveloper in Launchpad TB6612FNG Motor Driver   
    I picked it because of price. Only $8.95 on a breakout board with the needed circuitry. It has plenty of power for the small motors included with the Magician Robot Chassis too. Works well enough that I'm considering using it to make a simple Robotics Booster Pack.
     
  9. Like
    kenemon reacted to gwdeveloper in differential photo sensor   
    Hello Kenemon, there a few things you could change to better use the ADC's DTC. The ADC should be enabled inside of the main loop and left running. Using the DTC, you can enable continuous repeated conversions and turn the cpu off. You can enter low power modes this way and not have the cpu turning the peripheral on and off.
     
    Try looking at the code I posted here http://www.43oh.com/forum/viewtopic.php?f=9&t=1701#p11692. In particular, the ADC_init function, and block below from the main loop. I'm using the continuous mode and repeating conversions. This does collect data from ADC channels, 5-0 and then filter out the 2 channels I am actually using. (Which are the same channels you are using.)
     

    // sample ADC10 and use DTC ADC10CTL0 &= ~ENC; while (ADC10CTL1 & BUSY); // Wait if ADC10 core is active ADC10SA = (unsigned int)ADCdata; // Data buffer start ADC10CTL0 |= ENC + ADC10SC; // Sampling and conversion start // get float of left channel P1.4 left = 0; for (l=LEFT; l < MAXADC; l+=6) { left += ADCdata[l]; } left /= SAMPLES; // get float of right channel P1.5 right = 0; for (r=RIGHT; r < MAXADC; r+=6) { right += ADCdata[r]; } right /= SAMPLES;
     
    Let me know if you can't sort out the code on that link.
  10. Like
    kenemon got a reaction from RobG in Halloween project idea   
    Sorry Rob, not trying to be a smart$%&....
  11. Like
    kenemon got a reaction from PentiumPC in Enclosures/ Cases for projects   
    You can have one made for a prototype using CAD files and 3D printer......
     
    http://www.ponoko.com/
     
    I had a great experience, and they have a variety of materials.
  12. Like
    kenemon reacted to RobG in 4ch Volt Meter using Nokia 5110   
    This is just to show what can be done with 5110.
    FYI, inputs are floating, top bar is P1.3, which is pulled-up by default, values are raw, not calibrated.




    #include "msp430g2553.h" #include "PCD8544.h" #define LCD5110_SCLK_PIN BIT5 #define LCD5110_DN_PIN BIT7 #define LCD5110_SCE_PIN BIT4 #define LCD5110_DC_PIN BIT6 #define LCD5110_SELECT P1OUT &= ~LCD5110_SCE_PIN #define LCD5110_DESELECT P1OUT |= LCD5110_SCE_PIN #define LCD5110_SET_COMMAND P1OUT &= ~LCD5110_DC_PIN #define LCD5110_SET_DATA P1OUT |= LCD5110_DC_PIN #define LCD5110_COMMAND 0 #define LCD5110_DATA 1 void writeStringToLCD(const char *string); void writeCharToLCD(char c); void writeToLCD(unsigned char dataCommand, unsigned char data); void clearLCD(); void setAddr(unsigned char xAddr, unsigned char yAddr); void initLCD(); void binaryToUnpackedBCD(unsigned int n, unsigned char * digits); unsigned char bcd[4] = {0,0,0,0}; int adc[4] = {0,0,0,0}; unsigned char last[4] = {0,0,0,0}; static const char tick[64] = { 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x06, 0x04, 0x07, 0x04, 0x06, 0x04 }; void main(void) { WDTCTL = WDTPW + WDTHOLD; // disable WDT BCSCTL1 = CALBC1_1MHZ; // 1MHz clock DCOCTL = CALDCO_1MHZ; P1OUT |= LCD5110_SCE_PIN + LCD5110_DC_PIN; P1DIR |= LCD5110_SCE_PIN + LCD5110_DC_PIN; // setup USIB P1SEL |= LCD5110_SCLK_PIN + LCD5110_DN_PIN; P1SEL2 |= LCD5110_SCLK_PIN + LCD5110_DN_PIN; UCB0CTL0 |= UCCKPH + UCMSB + UCMST + UCSYNC; // 3-pin, 8-bit SPI master UCB0CTL1 |= UCSSEL_2; // SMCLK UCB0BR0 |= 0x01; // 1:1 UCB0BR1 = 0; UCB0CTL1 &= ~UCSWRST; // clear SW ADC10CTL1 = INCH_3 + CONSEQ_1; ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE; ADC10DTC1 = 0x04; ADC10AE0 |= 0x0F; _delay_cycles(500000); initLCD(); clearLCD(); // LCD test writeStringToLCD("4ch Volt Meter"); setAddr(0,5); writeStringToLCD("by RobG @ 43oh"); char c = 0; // setup tickmarks char d = 0; while(d < 4) { d++; c = 0; setAddr(0,d); while(c < 64) { writeToLCD(LCD5110_DATA, tick[c]); c++; } } _bis_SR_register(GIE); while(1) { ADC10SA = (unsigned int)&adc[0]; ADC10CTL0 |= ENC + ADC10SC; _delay_cycles(100000); } } // ADC10 interrupt service routine #pragma vector=ADC10_VECTOR __interrupt void ADC10_ISR(void) { ADC10CTL0 &= ~ENC; char c = 0; while(c < 4) { unsigned char curr = adc[c] >> 4; unsigned char prev = last[c]; unsigned char b = 0; unsigned char t = 0; binaryToUnpackedBCD(curr, bcd); if(curr < prev) { setAddr(curr, c + 1); b = prev - curr + 1; t = curr; while(b > 0) { writeToLCD(LCD5110_DATA, tick[t++]); b--; } } else if(curr > prev) { setAddr(prev, c + 1); b = curr - prev; t = prev; while(b > 0) { writeToLCD(LCD5110_DATA, 0x70 | tick[t++]); b--; } } setAddr(70 ,c + 1); writeCharToLCD(bcd[2] + 0x30); writeToLCD(LCD5110_DATA, 0x40); writeToLCD(LCD5110_DATA, 0x0); writeCharToLCD(bcd[3] + 0x30); last[c] = curr; c++; } } void writeStringToLCD(const char *string) { while(*string) { writeCharToLCD(*string++); } } void writeCharToLCD(char c) { unsigned char i; for(i = 0; i < 5; i++) { writeToLCD(LCD5110_DATA, font[c - 0x20][i]); } writeToLCD(LCD5110_DATA, 0); } void writeToLCD(unsigned char dataCommand, unsigned char data) { LCD5110_SELECT; if(dataCommand) { LCD5110_SET_DATA; } else { LCD5110_SET_COMMAND; } UCB0TXBUF = data; while(!(IFG2 & UCB0TXIFG)) ; LCD5110_DESELECT; } void clearLCD() { setAddr(0, 0); int c = 0; while(c < PCD8544_MAXBYTES) { writeToLCD(LCD5110_DATA, 0); c++; } setAddr(0, 0); } void setAddr(unsigned char xAddr, unsigned char yAddr) { writeToLCD(LCD5110_COMMAND, PCD8544_SETXADDR | xAddr); writeToLCD(LCD5110_COMMAND, PCD8544_SETYADDR | yAddr); } void initLCD() { writeToLCD(LCD5110_COMMAND, PCD8544_FUNCTIONSET | PCD8544_EXTENDEDINSTRUCTION); writeToLCD(LCD5110_COMMAND, PCD8544_SETVOP | 0x3F); writeToLCD(LCD5110_COMMAND, PCD8544_SETTEMP | 0x02); writeToLCD(LCD5110_COMMAND, PCD8544_SETBIAS | 0x03); writeToLCD(LCD5110_COMMAND, PCD8544_FUNCTIONSET); writeToLCD(LCD5110_COMMAND, PCD8544_DISPLAYCONTROL | PCD8544_DISPLAYNORMAL); } void binaryToUnpackedBCD(unsigned int n, unsigned char * digits) { __asm(" clr R14"); __asm(" rla R12"); __asm(" rla R12"); __asm(" rla R12"); __asm(" rla R12"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" rla R12"); __asm(" dadd R14, R14"); __asm(" mov.b R14, 3(R13)"); __asm(" swpb R14"); __asm(" mov.b R14, 1(R13)"); __asm(" rra R14"); __asm(" rra R14"); __asm(" rra R14"); __asm(" rra R14"); __asm(" mov.b R14, 0(R13)"); __asm(" swpb R14"); __asm(" mov.b R14, 2(R13)"); __asm(" and #0x0F0F, 0(R13)"); __asm(" and #0x0F0F, 2(R13)"); return; }
    #ifndef PCD8544_H_#define PCD8544_H_#define PCD8544_POWERDOWN 0x04#define PCD8544_ENTRYMODE 0x02#define PCD8544_EXTENDEDINSTRUCTION 0x01#define PCD8544_DISPLAYBLANK 0x0#define PCD8544_DISPLAYNORMAL 0x4#define PCD8544_DISPLAYALLON 0x1#define PCD8544_DISPLAYINVERTED 0x5// H = 0#define PCD8544_FUNCTIONSET 0x20#define PCD8544_DISPLAYCONTROL 0x08#define PCD8544_SETYADDR 0x40#define PCD8544_SETXADDR 0x80#define PCD8544_HPIXELS 84#define PCD8544_VBANKS 6#define PCD8544_MAXBYTES 504 // PCD8544_HPIXELS * PCD8544_VBANKS// H = 1#define PCD8544_SETTEMP 0x04#define PCD8544_SETBIAS 0x10#define PCD8544_SETVOP 0x80//transform#define NONE 0x00#define FLIP_H 0x01#define FLIP_V 0x02#define ROTATE 0x04 // 90 deg CW#define ROTATE_90_CW ROTATE#define ROTATE_90_CCW (FLIP_H | FLIP_V | ROTATE)#define ROTATE_180 (FLIP_H | FLIP_V)static const char font[][5] = { // basic font{0x00, 0x00, 0x00, 0x00, 0x00} // 20,{0x00, 0x00, 0x5f, 0x00, 0x00} // 21 !,{0x00, 0x07, 0x00, 0x07, 0x00} // 22 ",{0x14, 0x7f, 0x14, 0x7f, 0x14} // 23 #,{0x24, 0x2a, 0x7f, 0x2a, 0x12} // 24 $,{0x23, 0x13, 0x08, 0x64, 0x62} // 25 %,{0x36, 0x49, 0x55, 0x22, 0x50} // 26 &,{0x00, 0x05, 0x03, 0x00, 0x00} // 27 ',{0x00, 0x1c, 0x22, 0x41, 0x00} // 28 (,{0x00, 0x41, 0x22, 0x1c, 0x00} // 29 ),{0x14, 0x08, 0x3e, 0x08, 0x14} // 2a *,{0x08, 0x08, 0x3e, 0x08, 0x08} // 2b +,{0x00, 0x50, 0x30, 0x00, 0x00} // 2c ,,{0x08, 0x08, 0x08, 0x08, 0x08} // 2d -,{0x00, 0x60, 0x60, 0x00, 0x00} // 2e .,{0x20, 0x10, 0x08, 0x04, 0x02} // 2f /,{0x3e, 0x51, 0x49, 0x45, 0x3e} // 30 0,{0x00, 0x42, 0x7f, 0x40, 0x00} // 31 1,{0x42, 0x61, 0x51, 0x49, 0x46} // 32 2,{0x21, 0x41, 0x45, 0x4b, 0x31} // 33 3,{0x18, 0x14, 0x12, 0x7f, 0x10} // 34 4,{0x27, 0x45, 0x45, 0x45, 0x39} // 35 5,{0x3c, 0x4a, 0x49, 0x49, 0x30} // 36 6,{0x01, 0x71, 0x09, 0x05, 0x03} // 37 7,{0x36, 0x49, 0x49, 0x49, 0x36} // 38 8,{0x06, 0x49, 0x49, 0x29, 0x1e} // 39 9,{0x00, 0x36, 0x36, 0x00, 0x00} // 3a :,{0x00, 0x56, 0x36, 0x00, 0x00} // 3b ;,{0x08, 0x14, 0x22, 0x41, 0x00} // 3c <,{0x14, 0x14, 0x14, 0x14, 0x14} // 3d =,{0x00, 0x41, 0x22, 0x14, 0x08} // 3e >,{0x02, 0x01, 0x51, 0x09, 0x06} // 3f ?,{0x32, 0x49, 0x79, 0x41, 0x3e} // 40 @,{0x7e, 0x11, 0x11, 0x11, 0x7e} // 41 A,{0x7f, 0x49, 0x49, 0x49, 0x36} // 42 B,{0x3e, 0x41, 0x41, 0x41, 0x22} // 43 C,{0x7f, 0x41, 0x41, 0x22, 0x1c} // 44 D,{0x7f, 0x49, 0x49, 0x49, 0x41} // 45 E,{0x7f, 0x09, 0x09, 0x09, 0x01} // 46 F,{0x3e, 0x41, 0x49, 0x49, 0x7a} // 47 G,{0x7f, 0x08, 0x08, 0x08, 0x7f} // 48 H,{0x00, 0x41, 0x7f, 0x41, 0x00} // 49 I,{0x20, 0x40, 0x41, 0x3f, 0x01} // 4a J,{0x7f, 0x08, 0x14, 0x22, 0x41} // 4b K,{0x7f, 0x40, 0x40, 0x40, 0x40} // 4c L,{0x7f, 0x02, 0x0c, 0x02, 0x7f} // 4d M,{0x7f, 0x04, 0x08, 0x10, 0x7f} // 4e N,{0x3e, 0x41, 0x41, 0x41, 0x3e} // 4f O,{0x7f, 0x09, 0x09, 0x09, 0x06} // 50 P,{0x3e, 0x41, 0x51, 0x21, 0x5e} // 51 Q,{0x7f, 0x09, 0x19, 0x29, 0x46} // 52 R,{0x46, 0x49, 0x49, 0x49, 0x31} // 53 S,{0x01, 0x01, 0x7f, 0x01, 0x01} // 54 T,{0x3f, 0x40, 0x40, 0x40, 0x3f} // 55 U,{0x1f, 0x20, 0x40, 0x20, 0x1f} // 56 V,{0x3f, 0x40, 0x38, 0x40, 0x3f} // 57 W,{0x63, 0x14, 0x08, 0x14, 0x63} // 58 X,{0x07, 0x08, 0x70, 0x08, 0x07} // 59 Y,{0x61, 0x51, 0x49, 0x45, 0x43} // 5a Z,{0x00, 0x7f, 0x41, 0x41, 0x00} // 5b [,{0x02, 0x04, 0x08, 0x10, 0x20} // 5c
  13. Like
    kenemon reacted to bluehash in Free STM32F4 discovery kit in US/Canada   
    I'm able to talk to an SD card via a 2452 using petit-fs, the smaller version of elmchan. I'll publish my code in a few days if anyone is interested.
  14. Like
    kenemon reacted to Rickta59 in Free STM32F4 discovery kit in US/Canada   
    I'm not sure what size SD/MMC card you are trying to support, however the FatFs Generic FAT File System Module might work on one of the msp430s that have > than 1k of RAM. You might look at the generic version of the code to get started. You can find more info here: http://elm-chan.org/fsw/ff/00index_e.html
     
    -rick
  15. Like
    kenemon reacted to bluehash in Free STM32F4 discovery kit in US/Canada   
    TI Beagle board might help. $150.
  16. Like
    kenemon reacted to bluehash in LS Research TiWi-R2 Module PCB/Booster Pack   
    Moved to Booster Packs sub-forum as it belongs here.
    Also changed first post title to reflect pack description.
  17. Like
    kenemon reacted to zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    To me, "exposed copper" means that there is no solder mask covering the pad.
     
    In an extreme situation, it could mean that there is absolutely no tinning on those pads as well.
     
    The reason for this would be due to mechanical alignment. Imagine the thickness of tinning plus solder. That could create bumps under the module during solder reflow. That would cause the module to float around when the solder is in the liquid/plastic phase transition state. The result is the module moves out of alignment on the footprint. This situation is probably rare and an engineer is just covering his butt with this choice of words.
  18. Like
    kenemon got a reaction from bluehash in LS Research TiWi-R2 Module PCB/Booster Pack   
    Yes. Much like the ProFLEX PCB in the picture above but 2x2". I did not do much with the connections, as I am still trying to get a better understanding of the module. The LSR datasheets are simplified, and do not provide much guidance. My first concern is the 1.8V VIO. There is some mention of signal translation.
     
    KB
  19. Like
    kenemon reacted to zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    That should work. :thumbup:
     
    Get that on the LaunchPad because you're ready for liftoff.
  20. Like
    kenemon reacted to zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    Oh! I just noticed something else that I would buff. You need a really beefy ground system!
     
    On the left side of the board, bottom side, you have a spindley little ground track connecting center ground pour to the left side pins. That will never do.
     
    You should make the ground tracks as wide as possible. Say 0.030" and whatever width you can route between the vias. If you can, you should lay down more beefy ground tracks between the center ground pour and the left side ground pins.
     
    Try laying horizontally the thickest ground track you can between the center ground plane to the top-left ground pins.
     
    Make sense?
  21. Like
    kenemon reacted to zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    :thumbup: :thumbup: :thumbup:
     
    That looks perfect to me.
     
    One more thing though. I just noticed that the antenna track needs some buffing. It's got to be made into a 50 ohm transmission line.
     
    1. Extended the bottom side ground pour so that it is beneath the antenna track.
    2. Place ground pours on along the left and the right side of the top side antenna track.
    3. Place a hedge of vias along the left and the right side of the top side antenna track.
    4. Make those vias connect to the bottom side ground pour.
    5. The antenna track width should be 0.010".
    6. The spacing between the antenna track and the top side ground pours should be 0.010". This will make a 50 ohm transmission line.
    7. Place an approved RF connector footprint at the board edge so you can connect an antenna to the module. I suggest an SMA connector. Either this or this would be fine. It's up to you.
     
     
    Is this just a breakout board?
  22. Like
    kenemon reacted to bluehash in LS Research TiWi-R2 Module PCB/Booster Pack   
    Moving to MSP/General for more exposure and is also better suited there.
  23. Like
    kenemon reacted to zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    I like the complete bottom side ground flood. That will work well.
     
    By the way, is the bottom side ground plane connected to the four pins of the SMA connector using thermal relief pads? Every pad connected to the ground plane should be using the thermal relief pad (for reasons previously noted).
     
    I'm having difficulty knowing what is happening on the top side around the antenna track. I can see the vias lined up like a hedge. Are they connected to a top side ground plane as well? They should be.
     
    Could you extrude the top side ground plane under the module upwards along the antenna track?
    It will then connect the vias to the bottom side ground plane.
     
     
    I can see it now. This is going to be an excellent RF clean board. Good work!
  24. Like
    kenemon reacted to zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    All righty then.
     
    The footprint for the TiWi module matches the data sheet (pg 28) exactly. Good job!
     
    The only gotcha that I can see is the ground plane.
     
    On page 28 of the datasheet, Layout Notes #1 & #2 are the gotchas.
     
    Gotcha #1: The manufacturer is expecting the user to create a 4 layer pcb where the second layer is a ground plane. I believe you're making a 2 layer board.
     
    Resolution: You create a ground pour on your bottom layer underneath the device on the top and the bottom layers.
     
    Gotcha #2: The manufacturer is expecting the user to create a solid ground connection between top, bottom and inner layer 2 (GND) using Ample Vias.
     
    Resolution: You add in zillions of vias to connect the top and the bottom ground pours. Pick a standard sized via. Datasheet says 0.4mm diameter. Space them 1mm apart in a grid pattern. That's going to be a lot of vias but don't sweat it.
     
     
    If you ground the H. E. double hockey sticks out of the board then it will work well.
     
    Does that help?
  25. Like
    kenemon reacted to zeke in LS Research TiWi-R2 Module PCB/Booster Pack   
    Ah nuts. I'm 200 miles away from home and all I have is my iPod touch. It's useless for checking layouts.
     
    I'll be back home tomorrow and I'll check it out then.
     
    Hopefully Designspark is easy to work with.
     
    I can also work with gerber files too. Actually that might be better. Can you post a link to them for me?
     
    We'll make sure this is right.
×
×
  • Create New...