MSP430 G2553 Launchpad实现电容测量

最新更新时间:2022-01-27来源: eefocus关键字:MSP430  G2553  Launchpad  电容测量 手机看文章 扫描二维码
随时随地手机看文章

一、基本原理

对于Source-Free RC电路,其电容放电的特性可以描述为:

其中V0是电容的初始电压,t是放电时间,R是串接的电阻阻值,C是电容值,v(t)是t时刻电容上的电压。因此,若已知V0、R、以及t1时刻的电压Vt1,便可求得C:

二、如何控制和测量

如上图所示,大致步骤为:1)由GPIO通过电阻R给电容C充电至Vcc;2)该GPIO输出0,电容C通过R进行放电,同时Timer开始计时、CA+开启;3)当电容电压放电至参考电压(此处是0.25Vcc)时,比较器CA+输出端出现电平变化;4)中断程序捕获这一变化,并利用Timer的capture mode获得该时刻的时间,最后通过以上方程计算电容值。


上图中R推荐采用1%精度的电阻,以提高测试精度。


三、状态转换图

四、测试代码

main.c程序:


  1 // C meter 2015.9.26

  2 //

  3 // P1.5(TA0.0) --[||||]----------- P1.4(CA3)

  4 //             R=10kOhm     |

  5 //                       -----

  6 //                   cap -----

  7 //                         |

  8 //                        GND

  9 //  http://zlbg.cnblogs.com

 10 /////////////////////////////////////////

 11 

 12 #include "io430.h"

 13 

 14 #define LED1 BIT0 // P1.0, red led

 15 #define LED2 BIT6 // P1.6, green led

 16 

 17 #define VMEAS BIT4 // P1.4(CA4) for voltage measurement of the cap

 18 #define VCTRL BIT5 // P1.5(TA0.0) for voltage control

 19 #define PUSH2 BIT3 // P1.3, button

 20 

 21 #define RXD BIT1 //P1.1

 22 #define TXD BIT2 //P1.2

 23 

 24 #define READY 0

 25 #define CHARGING 1

 26 #define DISCHARGING 2

 27 #define FINISH_DC 3

 28 

 29 #define R_SERIES 10000 //10kOhm

 30 #define LN4 1.3863

 31 

 32 //functions for C meter

 33 void P1Init(void);

 34 void TA0Init(void);

 35 void CAInit(void);

 36  

 37 void setReadyStatus(void);

 38 

 39 //functions for printf()

 40 void sendByte(unsigned char);

 41 void printf(char *, ...);

 42 void initUART(void);

 43 

 44 char state = READY;

 45 unsigned char overflowsCharging = 0;

 46 unsigned char overflowsDischarging = 0;

 47 unsigned char i = 0;

 48 float capacitance = 0; // unit: nF

 49 

 50 void main(void)

 51 {

 52     // Stop watchdog timer to prevent time out reset

 53     WDTCTL = WDTPW + WDTHOLD;

 54     

 55     // DCO setup

 56     BCSCTL1 = CALBC1_1MHZ; //running at 1Mhz

 57     DCOCTL = CALDCO_1MHZ;

 58     

 59     // P1 setup

 60     P1Init();

 61     

 62     // Timer0 setup

 63     TA0Init();

 64     

 65     // CA setup

 66     CAInit();  

 67     

 68     // UART setup

 69     initUART();

 70     

 71     setReadyStatus();

 72     

 73     __enable_interrupt();

 74     

 75     // enter LP mode

 76     LPM0;

 77     

 78 }

 79 

 80 

 81 void P1Init(void)

 82 {

 83     P1OUT = 0;

 84     

 85     // set P1.3 (PUSH2) as input with pullup

 86     P1OUT |= PUSH2;

 87     P1REN |= PUSH2;

 88         

 89     // set P1.0, P1.6, P1.5 as output

 90     P1DIR |= LED1 + LED2 + VCTRL;

 91  

 92     // enable P1.3 interrupt

 93     P1IES |= PUSH2; // high -> low transition

 94     P1IFG &= ~PUSH2; // clear the flag

 95     P1IE |= PUSH2;

 96 }

 97 

 98 void TA0Init(void)

 99 {

100     // use SMCLK (1MHz), no div, clear, halt

101     TA0CTL = TASSEL_2 + ID_0 + MC_0 + TACLR;

102     

103     // TA0CCTL0: compare mode, enable interrupt

104     TA0CCTL0 = CCIE;

105     

106     // TA0CCTL1: capture mode, no capture, CCI1B(CAOUT) input, syn capture

107     // interrupt enabled

108     TA0CCTL1 = CCIS_1 + SCS + CAP + CCIE;

109 }

110 

111 void CAInit(void)

112 {

113     //0.25 Vcc ref on V+, halt

114     CACTL1 = CAREF_1 + CAIES;

115     // input CA4 (P1.4), remove the jumper) on V-, filter on

116     CACTL2 = P2CA3 + CAF; 

117 }

118 

119 void setReadyStatus(void)

120 {   

121     state = READY;

122     // light led2 and turn off led1 to indicate ready

123     P1OUT &= ~LED1;

124     P1OUT |= LED2;

125     

126     //stop and clear timer, stop T0_A1 capture & CA+

127     TA0CTL = TASSEL_2 + ID_0 + MC_0 + TACLR;

128     TA0CCTL1 &= ~CM_3;

129     CACTL1 &= ~CAON;

130     

131     overflowsCharging = 0;

132 }

133 

134 void initUART(void) {  

135         //config P1.1 RXD, P1.2 TXD

136         P1SEL |= TXD + RXD;

137         P1SEL2 |= TXD + RXD;

138         

139         //reset UCA0, to be configured

140         UCA0CTL1 = UCSWRST;

141         //config

142         UCA0CTL1 |= UCSSEL_2; //SMCLK

143         UCA0BR0 = 104;

144         UCA0BR1 = 0;//1MHz baut rate = 9600 8-N-1

145         UCA0MCTL = UCBRS0; // Modulation UCBRSx = 1

146         //make UCA0 out of reset

147         UCA0CTL1 &= ~UCSWRST;

148 }

149 

150 

151 void sendByte(unsigned char byte )

152 {

153     while (!(IFG2&UCA0TXIFG));            // USCI_A0 TX buffer ready?

154     UCA0TXBUF = byte;                // TX -> RXed character

155 }

156 

157 #pragma vector = PORT1_VECTOR

158 __interrupt void P1_ISR(void)

159 {

160     if((P1IFG & PUSH2) == PUSH2)

161     {

162         P1IFG &= ~PUSH2; //clear the flag

163         switch(state)

164         {

165         case READY:

166             state = CHARGING;

167             // light LED1 and turn off LED2, indicate a busy status

168             P1OUT |= LED1; 

169             P1OUT &= ~LED2;

170             //start timer, continuous mode

171             TACTL |= MC_2; 

172             //start charging

173             P1OUT |= VCTRL;

174             break;

175         default:

176             break;

177         }

178         

179     }

180     else

181     {

182         P1IFG = 0;

183     }

184 }

185 

186 #pragma vector = TIMER0_A0_VECTOR

187 __interrupt void CCR0_ISR(void)

188 {

189     switch(state)

190     {

191     case CHARGING:

192         if (++overflowsCharging == 50) // wait 6.5535*50 = 3.28s

193         {

194             state = DISCHARGING;

195             CACTL1 |= CAON; // turn on CA+

196             TA0CCTL1 |= CM_1; // start TA1 capture on rising edge

197             P1OUT &= ~VCTRL; // start discharging     

198             overflowsDischarging = 0;

199         }

200         break;

201     case DISCHARGING:

202         overflowsDischarging++;

203     default:

204         break;

205         

206     }

207 

208 }

209 

210 #pragma vector = TIMER0_A1_VECTOR

211 __interrupt void CCR1_ISR(void)

212 {

213     TA0CTL &= ~MC_3; //stop timer

214     TA0CCTL1 &= ~CCIFG; // clear flag

215     switch(state)

216     {

217     case DISCHARGING:

218         state = FINISH_DC;        

219         capacitance = (overflowsDischarging*65536 + TA0CCR1)*1000 / (R_SERIES*LN4); //nF

220         //send result to PC     

221         printf("Capatitance:  %n", (long unsigned)capacitance);

222         printf(" nFrn");

223         

224         setReadyStatus();

225         break;

226     default:

227         break;

228     }

229 }


printf.c程序:为将电容结果通过UART输出至PC显示,以下这段程序实现了printf()函数,代码来自于NJC's MSP430 LaunchPad Blog博客和oPossum的代码。

[1] [2]
关键字:MSP430  G2553  Launchpad  电容测量 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic559141.html

上一篇:MSP430G2553 Launchpad 硬件I2C驱动
下一篇:MSP430 G2553 比较器Comparator_A+、数据流程图DFD、状态转换图STD

推荐阅读

MSP430-Timer(三)
查询数据手册可知,有四个定时器,分别是TimerA0,A1,A2,B0,接下来主要针对TimerA进行主要探究.Timer_A介绍Timer_A是一个16位的计时器/计数器,有多达7个捕获/比较寄存器。Timer_A可以支持多个捕获/比较,PWM输出,间隔计时。Timer_A还具有广泛的中断功能。在溢出条件下,可以从计数器和每个捕获/比较寄存器中生成中断。Timer_A功能包括:异步16位定时器/计数器,四种操作模式可选择和可配置的时钟源最多可配置7个捕获/比较寄存器具有脉宽调制(PWM)能力的可配置输出异步输入和输出闭锁中断向量寄存器用于快速解码单脉冲的PWM输出1.设置IO口为输出模式 //P2.0 as PWM output
发表于 2022-08-10
<font color='red'>MSP430</font>-Timer(三)
MSP430——UART(四)
最近由于在做去年送药小车国赛题,需要使用到MSP430和OPENMV之间的通信,故着手看看MSP430的串口模式。第一步:IO口配置我使用的这款芯片是MSP430F5529,他的TX端设置在P3.3,RX端设置在P3.4,故首先第一步开启两个IO口的输入。//P3.3 = USCI_A0 TXD GPIO_setAsPeripheralModuleFunctionInputPin( GPIO_PORT_P3, GPIO_PIN3|GPIO_PIN4 );第二步:串口配置USCI_A_UART_initParam param1 = {0}; param1.selectClockSource = USCI_A_UA
发表于 2022-08-09
<font color='red'>MSP430</font>——UART(四)
MSP430——Timer(输出比较编码器测速)
之前写过关于定时器输出PWM波的简便方法和利用定时器测量频率,由于之前采用的测周法,这个方法当时测量的频率是非常精准的,但是对于测速度而言,我们采用PID算法的话,就会使得轮子停止响应非常的迅速,在之前算法的基础上,这个当轮子突然停止,也就是说突然一下没有外来脉冲了,会导致频率计算出错,维持一个定值,按理来说应该是零的(如果能够从算法上解决这个问题的话,麻烦大佬们评论区传授一下方法),因此,今天开始尝试利用测频法进行速度测量,相应的使用的就是定时器的输出比较功能,即开一定时间的定时器,再打开IO中断捕捉上升沿或者下降沿,每隔一定时间,获取IO中断捕获的上升沿或者下降沿的脉冲数,从而达到计算速度的目的。第一步:初始化对应定时器Time
发表于 2022-08-09
MSP430f5529-GPIO简介
理论上来说,在不进行端口功能复用的情况下,每一个端口都能用作普通GPIO口用。其中P1和P2端口可以用作外部中断端口。其余的端口作用可以参考开发板自带的端口功能图。 这里介绍外部中断和普通作用GPIO口寄存器和配置。 430f5529使用的是宏定义的引脚名称。 这里用P1口做例子: 1.P1IN 可以读取当前P1端口某引脚上的信号值,用于读取电平信号,比如检测按键输入,通过读取P1IN 的值判断按键是否按下,如果按下了检测到的都是低电平,返回的就是0,反之1。 用法: if (P1IN & BIT0),此为读取P1.0引脚上电平信号 2.P1OUT 可以决定引脚的输出,比如在点亮Led灯的
发表于 2022-08-08
<font color='red'>MSP430</font>f5529-GPIO简介
MSP430F5529-定时器介绍
开发板有两个定时器:定时器A和定时器B。因为定时器B和定时器A差不多,所以就介绍一下定时器A。 定时器A一共有三个,定时器B有一个。其中定时器A分为Timer0_A,Timer1_A,Timer2_A。定时器A支持多重捕获/比较,PWM输出和定时功能,具备中断函数,可以通过定时器溢出或者捕获/比较触发。 这里介绍定时器A的定时器功能和输出PWM功能。其他没涉及的不做介绍。 下面介绍定时器A0相关的寄存器: 1.TA0CTL 寄存器是定时器A的总控制寄存器,可以通过写入宏定义好的单词来配置相关位 2.TA0CCTL0 寄存器是定时器A下第一个捕获/比较器的控制寄存器,也可以通过写入相关单词来配置对
发表于 2022-08-08
<font color='red'>MSP430</font>F5529-定时器介绍
MSP430F5529-串口介绍
开发板一共有两个串口,分别为P4.4,P4.5和P3.3,P3.4 其中P4的串口是开发板上面用短接套套起来的那个,套上短接套进行相关以后就可以和电脑进行串口通信,也可以拆下短接套和其他外设或芯片进行串口通信。 不同频率第四步的配置的数据不同,其他配置应该没什么差别。 对于串口0的配置顺序也是这样的,只要把UCA后面的1改成0就行了。 注:截取的送药车代码,没测试过。 配置过程为: 1.特殊功能相关引脚 2.串口1功能配置寄存器(UCA1CTL1)中置位 UCSWRST 以进行接下来的配置,不置位不能正常配置串口。 3.功能配置寄存器选择时钟源。 4.根据用户手册配置UC
发表于 2022-08-05

推荐帖子

上位机软件类编写心得
开发上位机软件的语言有很多,为何偏偏选中了.NET呢,主要是因为这个语言开发上位机软件相当方面而且微软提供了大量的类库和API。虽然底层实现代码不像JAVA一样可以开源的,但是这个不影响这门语言的推广,试问有几个人会真正意义上去研究底层的代码呢?再说我们是搞工程的,在保证质量的前提下追求的是速度。而且。NET开发图形界面是相当方便的,不像JAVA一样代码都要自己一笔一笔的写蛮麻烦。对于,NET开发上位机软件,我们应该做到什么程度才算用的比较熟练了呢?我觉得应该是自己会创建类,其实,NET最重要的
wateras1 DIY/开源硬件专区
细数T-BOX中TI的明星产品之车载以太网 | 第一节 DP83TC811S-Q1:车载以太网让您的T...
第一节DP83TC811S-Q1:车载以太网让您的T-BOX如虎添翼近年来“车联网”概念的热度一直都居高不下。说起车联网,当然就不得不提车载以太网以及车联网的核心组成部分之一---T-BOX!本文将会从车载以太网100BASE-T1说起,深入剖析车载以太网特点,并且详细介绍TI的明星产品DP83TC811S-Q1的优点以及在T-BOX的应用中的优势所在。什么是车载以太网?---从100BASE-T1说起以太网早已被广泛应用于商业和工业,但直到100BASE-T1
alan000345 TI技术论坛
JTAG在线调试映射问题
这两天用JTAG调试时发现奇怪的问题:每次发生中断时就跑飞,在网上搜了一下,原来是发生中断时没有找到中断向量表。我用反汇编单步调试,中断发生时,PC并没有跳到0x30000000处的中断向量表处(我已经在ADS把ROBase设置成0x30000000,也在IRQ中断设置了断点)就直接跑飞了。于是我把程序下载到NANDFlash(程序正常运行,中断没问题),在这情况下我再次使用JTAG在线调试,这下子中断不再跑飞了。于是我可以确定,JTAG在线调试发生中断时PC是跳到0x0开始的中断向量表。
good969 嵌入式系统
LPC2478驱动nand flash(k9f5608)
本帖最后由宇外星空于2017-4-114:30编辑 本文首发在CSDN,但是因为个人觉得CSDN可能更偏向于纯软件开发,而电子工程世界更适合和工程师们交流;所以决定还是将博客的主要发布改到这儿,初次见面,大家好~~关于LPC2478的操控系列是依据本人在工作项目中的经验而编写,会一步步分享给大家我的开发之路,有可能的话考虑出本小书将工程项目总结提炼一下作为LPC2478的实践工程入门读物吧(希望梦想能实现),所以有何建议和问题大家尽管提。先从控制nandflash开始写起,因为工
宇外星空 NXP MCU
用C#做过智能设备应用程序时怎么没有monthCalendar和dateTimePicker,这样的日期控件?
用C#做过智能设备应用程序时怎么没有monthCalendar和dateTimePicker,这样的日期控件? 工具箱里怎么没有?怎么加入??用C#做过智能设备应用程序时怎么没有monthCalendar和dateTimePicker,这样的日期控件?
senorspring 嵌入式系统
pic求教
请问pic能做飞控吗?pic求教
yyyyyx Microchip MCU
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved