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.

[参考译文] CCS/MSP430G2553:灵活

Guru**** 2539500 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/899378/ccs-msp430g2553-flex

器件型号:MSP430G2553

工具/软件:Code Composer Studio

大家好、我在检测柔性传感器的电阻和柔性角时遇到了问题、 我确实有欧姆计的代码、但我难以创建电阻和柔性角感应。我的电路是一个带柔性传感器的基本分压器、连接到输出 A4、另一个电阻接地。 电压源连接到柔性传感器。 我尝试显示电阻和弯曲角度

下面是我的当前代码:

#include
#include
#include

const float VCC=4.98;
const float R_div = 47500;
const Straight 电阻= 37300;
const bend_阻力= 90000;
int main (空)

WDTCTL = WDTPW + WDTHOLD;//停止 WDT

DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
BCSCTL1 = CALBC1_1MHz;//将 MCLK 和 SMCLK 设置为1MHz
DCOCTL = CALDCO_1MHz;//将 MCLK 和 SMCLK 设置为1MHz

//////// 串行端口反向通道设置

P1SEL = BIT1 + BIT2;//选择 UART 作为引脚功能
P1SEL2 = BIT1 + BIT2;
UCA0CTL1 |= UCSWRST;//禁用 UART 模块进行配置
UCA0CTL0 = 0x00;//无奇偶校验、LSB 在前、8位数据、1个停止位、 UART、异步
UCA0CTL1 = UCSSEL_2 + UCSWRST;// SMCLK 源、保持在复位状态
UCA0BR0 = 104;// 9600波特率-假定为1MHz 时钟
UCA0BR1 = 0;// 9600波特率-假定为1MHz 时钟
UCA0MCTL = 0x02;//第二级调制= 1、过采样关闭
IE2 = 0x00;//中断被禁用
UCA0CTL1 &=~UCSWRST;
//模拟设置
ADC10CTL1 = INCH_4 + ADC10DIV_3;//温度传感器和 ADC10CLK/4
// ADC 设置参数
ADC10CTL0 = SREF_1 + ADC10SHT_3 + REFON + ADC10ON + ADC10IE;
__delay_cycles (10000);// ADC 稳定所需

while (1)

ADC10CTL0 |= ENC + ADC10SC;//用中断开始采样和转换
_bis_SR_register (CPUOFF + GIE);//启用中断的 LPM0、睡眠直至中断
无符号长整型 flexADC = ADC10MEM;
int flexV = flexADC*VCC /1023;
int flexR = R_div *(VCC / flexV - 1);

// oC =((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278
//数据在 ADC10MEM 中以磁力显示
serial_string ("电阻");


serial_number (flexADC);


// ADC10中断服务例程
#pragma vector=ADC10_vector
_interrupt void ADC10_ISR (void)

_BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除 CPUOFF 位


//以下函数允许我们通过反向通道 UART 将字符串和数字写入 PC。
void serial_charTX (char c)

while (!(IFG2 & UCA0TXIFG));//等待发送缓冲区为空
UCA0TXBUF = c;//通过 Xmit 缓冲区发送字符

char serial_charRX (空)

while (!(IFG2 & UCA0RXIFG));//等待字符被接收
返回 UCA0RXBUF;//返回接收到的字符

void serial_string (字符串[])

int i;
for (i = 0;string[i]!='\0';i++)//发送字符直至字符串结束

if (string[i]='\n')//终端程序将\r 识别为回车
serial_charTX ('\r');
其他
serial_charTX (string[i]);

void serial_number (int 值)

字符串[10];

sprintf (string、"%d"、value);//将整数转换为字符串

serial_string (string);

这是 Arduino 代码版本、但我需要在 C 代码中使用它。

const int FLEX_PIN = A0; // Pin connected to voltage divider output

// Measure the voltage at 5V and the actual resistance of your
// 47k resistor, and enter them below:
const float VCC = 4.98; // Measured voltage of Ardunio 5V line
const float R_DIV = 47500.0; // Measured resistance of 3.3k resistor

// Upload the code, then try to adjust these values to more
// accurately calculate bend degree.
const float STRAIGHT_RESISTANCE = 37300.0; // resistance when straight
const float BEND_RESISTANCE = 90000.0; // resistance at 90 deg

void setup() 
{
  Serial.begin(9600);
  pinMode(FLEX_PIN, INPUT);
}

void loop() 
{
  // Read the ADC, and calculate voltage and resistance from it
  int flexADC = analogRead(FLEX_PIN);
  float flexV = flexADC * VCC / 1023.0;
  float flexR = R_DIV * (VCC / flexV - 1.0);
  Serial.println("Resistance: " + String(flexR) + " ohms");

  // Use the calculated resistance to estimate the sensor's
  // bend angle:
  float angle = map(flexR, STRAIGHT_RESISTANCE, BEND_RESISTANCE,
                   0, 90.0);
  Serial.println("Bend: " + String(angle) + " degrees");
  Serial.println();

  delay(500);
}
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您现在获得了什么结果?

    1) 1)不要忘记设置 AE 寄存器。 这将关闭施密特触发器、以便您可以获得介于"低"和"高"之间的(模拟)值。 对于 A4、这将是:

    > ADC10AE0 |=(1 << 4); //将 A4设置为模拟输入

    2) 2)我认为"flexV"将作为分数结束、因此在算术结果转换为"int"时被截断。 这也可能是"浮点"。 我怀疑您可以将 flexR 保持为"int"。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    新代码、但是每当我尝试弯曲柔性传感器时、它都会显示-63度的角度

    #include

    #include
    #include
    #include "serial_msp.h"

    常量浮点 VCC = 4.98;
    const float R_div = 47500;
    const float Straight 电阻= 0;
    const float bend_阻力= 320000;

    float 映射(float 值、float fromLow、float fromHigh、int toLow、int toHigh)

    返回(值-从低电平)*(ToHigh - ToLow)/(从高电平-从低电平)+到低电平;


    int main (空)

    WDTCTL = WDTPW + WDTHOLD;//停止 WDT

    DCOCTL = 0;//选择最低 DCOx 和 MODx 设置
    BCSCTL1 = CALBC1_1MHz;//将 MCLK 和 SMCLK 设置为1MHz
    DCOCTL = CALDCO_1MHz;//将 MCLK 和 SMCLK 设置为1MHz
    serial_init();

    /*//////// 串行端口反向通道设置

    P1SEL = BIT1 + BIT2;//选择 UART 作为引脚功能
    P1SEL2 = BIT1 + BIT2;
    UCA0CTL1 |= UCSWRST;//禁用 UART 模块进行配置
    UCA0CTL0 = 0x00;//无奇偶校验、LSB 在前、8位数据、1个停止位、 UART、异步
    UCA0CTL1 = UCSSEL_2 + UCSWRST;// SMCLK 源、保持在复位状态
    UCA0BR0 = 104;// 9600波特率-假定为1MHz 时钟
    UCA0BR1 = 0;// 9600波特率-假定为1MHz 时钟
    UCA0MCTL = 0x02;//第二级调制= 1、过采样关闭
    IE2 = 0x00;//中断被禁用
    UCA0CTL1 &=~UCSWRST;*/

    //模拟设置
    ADC10CTL1 = INCH_4 + ADC10DIV_3;//温度传感器和 ADC10CLK/4
    // ADC 设置参数
    ADC10CTL0 = SREF_1 + ADC10SHT_2 + REFON + ADC10ON + ADC10IE;
    __delay_cycles (10000);// ADC 稳定所需

    while (1)

    ADC10CTL0 |= ENC + ADC10SC;//用中断开始采样和转换
    _bis_SR_register (CPUOFF + GIE);//启用中断的 LPM0、睡眠直至中断
    无符号长整型 flexADC = ADC10MEM;
    float flexV = flexADC * VCC / 1023;
    float flexR = R_div *(VCC / flexV - 1);

    浮点角度= MAP (flexR、Straight 阻力、bend_阻力、0、90.0);


    // oC =((A10/1024)*1500mV)-986mV)*1/3.55mV = A10*423/1024 - 278
    //数据在 ADC10MEM 中以磁力显示
    serial_string ("\tResistance:\t");

    serial_number (flexR);


    serial_string ("\tADC:\t");
    serial_number (flexADC);
    // serial_string ("\n");

    serial_string ("\tband:\t");
    serial_number (角度);
    // serial_string ("\n");


    // ADC10中断服务例程
    #pragma vector=ADC10_vector
    _interrupt void ADC10_ISR (void)

    _BIC_SR_REGISTER_ON_EXIT (CPUOFF);//从0 (SR)清除 CPUOFF 位

    ////以下函数允许我们通过反向通道 UART 向 PC 写入字符串和数字。
    //void serial_charTX (char c)
    //{
    // while (!(IFG2 & UCA0TXIFG))
    //;//等待发送缓冲区为空
    // UCA0TXBUF = c;//通过 Xmit 缓冲区发送字符
    //}
    //
    //char serial_charRX (空)
    //{
    // while (!(IFG2 & UCA0RXIFG))
    //;//等待字符被接收
    //返回 UCA0RXBUF;//返回接收到的字符
    //}
    //
    //void serial_string (字符串[])
    //{
    // int i;
    // for (i = 0;string[i]!='\0';i++)//发送字符直至字符串结束
    //{
    // if (string[i]='\n')//终端程序将\r 识别为回车
    // serial_charTX ('\r');
    //否则
    // serial_charTX (string[i]);
    //}
    //}
    //
    //void serial_number (int 值)
    //{
    //字符串[10];
    //
    // sprintf (string、"%d"、value);//将整数转换为字符串
    //
    // serial_string (string);
    //}

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    网址是 serial.h

    /*
    * serial_msp.h
    *
    *创建日期:2012年6月1日
    *作者:Erioto
    *

    #ifndef serial_MSP_H_
    #define serial_MSP_H_

    #include
    #include

    //函数原型
    void serial_init (void);
    void serial_charTX (char c);
    char serial_charRX (void);
    void serial_string (字符串[]);
    void serial_number (int 值);

    #endif /* serial_MSP_H_*

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../7142.serial_5F00_msp.he2e.ti.com/.../serial_5F00_msp.ce2e.ti.com/.../7142.serial_5F00_msp.h

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    e2e.ti.com/.../2845.serial_5F00_msp.c

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    1) 1)我看不到您在何处设置 AE 寄存器。

    2)您已经添加了更多代码进行调试、但没有(尽可能接近我所能说的)解决原始问题。 我建议您使用调试器来确保 flexADC、flexV、flexR 和 angle 是您期望的值。 发现差异后、您将知道要集中在哪里。