Part Number:MSP430G2332
芯片:MSP430G2332。原理图如下,VCC直接接3.7V锂电池供电。
看到手册,通道11可以采样AVcc的二分之一电压。使用内部2.5V参考电压。
实际代码如下:
代码实际运行中,调整VCC电压至3.3V以下,甚至到2.5V了,也不能执行P2OUT |= (1 << 6); (P2OUT |= (1 << 6);已验证可以输出高低电平,驱动LED)。
想请教,ADC初始化和使用对吗?
主要是为了监控VCC的电压值,也就是锂电池供电电压。
另附全部代码。
#include <msp430.h>#include "stdint.h"
/*
* @fn: void InitSystemClock(void)
* @brief: 初始化系统时钟
* @para: none
* @return: none
* @comment:初始化系统时钟
*/
void InitSystemClock(void)
{
/*配置DCO为1MHz*/
DCOCTL = CALDCO_1MHZ;
BCSCTL1 = CALBC1_1MHZ;
/*配置SMCLK的时钟源为DCO*/
BCSCTL2 &= ~SELS;
/*SMCLK的分频系数置为1*/
BCSCTL2 &= ~(DIVS0 | DIVS1);
}
/*
* @fn: void InitADC(void)
* @brief: 初始化ADC
* @para: none
* @return: none
* @comment:初始化ADC
*/
void InitADC(void)
{
/*设置ADC时钟MCLK*/
ADC10CTL1 |= ADC10SSEL_2;
/*ADC 2分频*/
ADC10CTL1 |= ADC10DIV_0;
/*设置ADC基准源*/
ADC10CTL0 |= SREF_1;
/*设置ADC采样保持时间64CLK*/
ADC10CTL0 |= ADC10SHT_3;
/*设置ADC采样率200k*/
ADC10CTL0 &= ~ADC10SR;
/*ADC基准选择2.5V*/
ADC10CTL0 |= REF2_5V;
/*开启基准*/
ADC10CTL0 |= REFON;
/*选择ADC输入通道A0*/
ADC10CTL1 |= INCH_11;
/*允许A0模拟输入*/
ADC10AE0 |= 1<<11;
/*开启ADC*/
ADC10CTL0 |= ADC10ON;
}
/*
* @fn: uint16_t GetADCValue(void)
* @brief: 进行一次ADC转换并返回ADC转换结果
* @para: none
* @return: ADC转换结果
* @comment:ADC转换结果为10bit,以uint16_t类型返回,低10位为有效数据
*/
uint16_t GetADCValue(void)
{
/*开始转换*/
ADC10CTL0 |= ADC10SC|ENC;
/*等待转换完成*/
while(ADC10CTL1&ADC10BUSY);
/*返回结果*/
return ADC10MEM;
}
#define WHITE_LED_ON P2OUT &= ~(1 << 6)
#define WHITE_LED_OFF P2OUT |= (1 << 6)
#define WHITE_LED_BLINK P2OUT ^= (1 << 6)
#define WHITE_LED_STATE (P2OUT & (1 << 6))
/*
* main.c
*/
int main(void)
{
float voltage = 0;
uint16_t adcvalue = 0;
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
InitSystemClock();
InitADC();
// 引脚初始化
P1DIR = 0x1c; // P1.2/P1.4 output other input 2012-6-4
P1REN = 0xe3; // 2012-4-6
P1OUT = 0xfb; // 2012-4-6
P1IE &= ~0x02; // P1.1 interrupt disabled 2023-07-30
P1IES |= 0x02; // P1.1 negtive edge 2012-11-6
P1IFG &= ~0x02; // P1.1 IFG cleared 2012-11-6
P1SEL = 0x04; // P1.2/P1.4 as timer0 CCR1/CCR2 2012-6-4
P1SEL2 = 0x00; // 2012-7-3
P2DIR = 0xC0; // P2.6/P2.7 output 2012-6-4
P2REN = 0x3f; // 2012-6-4??
P2OUT = 0xff; // 2012-7-3??
P2SEL = 0x00; // 2012-6-4
P2SEL2 = 0x00;
WHITE_LED_ON;
while(1)
{
adcvalue = GetADCValue();
voltage = adcvalue * 2.5 / 1023;
voltage *= 2;
if(voltage <= 3.3)
{
P2OUT |= (1 << 6);
}
else
{
P2OUT &= ~(1 << 6);
}
}
return 0;
}
Ben Qin:
我查看下相关资料,稍后回复您。
,
user6303367:
好的,盼复。
,
Ben Qin:
你好,你的代码有没有参考TI的这些例程?你可以先拿着这些例程测试一下。
dev.ti.com/…/node
,
user6303367:
这个链接无法打开,显示403。
,
Ben Qin:
可以下载MSP430ware,在该路径下C:\ti\msp\MSP430Ware_3_80_14_01\examples\devices\MSP430G2xx\MSP430G2xx2_Code_Examples\C
,
user6303367:
好的,感谢!
,
Ben Qin:
不客气,这是下载链接:
www.ti.com.cn/…/MSPWARE