adc10scstm32定时器触发adc采集是什么东西

新手求基于msp430g2553定时器A0触发ADC10每隔一段时间采样的程序 - MSP430(TM)16 位超低功耗 MCU - 德州仪器在线技术支持社区
新手求基于msp430g2553定时器A0触发ADC10每隔一段时间采样的程序
发表于3年前
<input type="hidden" id="hGroupID" value="37"
& & & &本人刚接触map430不久,在定时器和ad采样方面有很多问题,希望高手帮忙解答。&/p>
&p>& & & &目的:实现定时器A0触发ADC10每隔一段时间采样,其他时间cpu有别的事干,采样对象为湿度传感器传回的电压值(0v~2.1v)。&/p>
&p>& & & &问题:1、低功耗LPM0模式下cpu停止,怎么还能执行main函数中的指令?&/p>
&p>& & & & & & & & &2、如何实现定时器A0触发ADC10每隔一段时间采样?求程序。&(这是主要问题)&/p>
&p>& & & & & & & & & &3、从ADC10MEM中读出的数据如何转化成0~100的数值,如何建立公式?&/p>&div style=&clear:&>&/div>" />
新手求基于msp430g2553定时器A0触发ADC10每隔一段时间采样的程序
此问题已被解答
All Replies
& & & &本人刚接触map430不久,在定时器和ad采样方面有很多问题,希望高手帮忙解答。
& & & &目的:实现定时器A0触发ADC10每隔一段时间采样,其他时间cpu有别的事干,采样对象为湿度传感器传回的电压值(0v~2.1v)。
& & & &问题:1、低功耗LPM0模式下cpu停止,怎么还能执行main函数中的指令?
& & & & & & & & &2、如何实现定时器A0触发ADC10每隔一段时间采样?求程序。&(这是主要问题)
& & & & & & & & & &3、从ADC10MEM中读出的数据如何转化成0~100的数值,如何建立公式?
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
探花13065分
zhang hao3,关于你的疑问,
1.&低功耗LPM0模式下cpu停止,是不能执行任何指令的,只是一直处于LPM0状态下。只是当你使用CCS或者IAR调试时,一直发现停下来时,都是停在进入LPM0的下一句,这是正常的。虽然指向这里,但是一直是处于LPM0的。如果同时又打开了GIE的话,那么中断可以将CPU从LPM0唤醒,来执行对应的中断处理函数,如果在退出中断时,又退出了LPM0,那么就会在退出中断后,执行main函数中LPM0之后的程序。
2. 可以使用TimerA来输出PWM, 然后使用PWM来触发ADC10采用,从而实现每隔一段时间采样。可参考附件中的例子。
3. 如果你只是想将ADC10MEM的值转换为0~100的数值,而不是实际对应的电压值,那么,
ADC10MEM的值的范围应该为0~1023,故若ADC10MEM=0,则value(0~100) = 0;&若ADC10MEM=1023,则value(0~100) = 100.
故&value(0~100) =&ADC10MEM / 1023 * 100.
希望对您有帮助!O(&_&)O~
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
恩恩。。谢谢了
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
举人1060分
1.&低功耗LPM0模式下,不能运行主程序。推出后执行进入低功耗语句后面的程序。
2. 建议使用中断方式,触发ADC10。
3.ADC10MEM中为AD采样值范围是0~1023。转化为0~100可以考虑转化成百分数&ADC10MEM/%
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
您好,我刚学MSP430,关于第二个问题,我想请问下,TimerA 的那些信号可以用来触发ADC10采样呢? 另外,手册中提到ADC10SC bit 、Timer_A.OUT1、Timer_A.OUT0 都可以触发ADC10,那么这几个信号分别是什么意思呢?分别指什么信号呢?谢谢!
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
我想问一下
TACCTL1 = OUTMOD_4; // Toggle on EQU1 (TAR = 0)
TACTL = TASSEL_2 + MC_2; // SMCLK, cont-mode & & 这两句话是用Timer_A.OUT1来触发AD采集,这个控制触发的周期是多少呢?假如说我的SMCLK是500Khz
You have posted to a forum that requires a moderator to approve posts before they are publicly available.
我想实现用定时器隔段时间进行ad10多通道采样,可是只能一次采集,还有好像进不了adc10的中断,求助&
#include &.h& #define num_of_results 12
#define uint unsigned int
&#define uchar unsigned char
//unsigned int a[50],b[50];
//static float adc0,adc1;
&int cc=0;
&void led_init();
void timer_init(); void delay(int);
void ADC_convert();
&uint a[num_of_results];
void delay(int i)&
&{int j,k; &
&for(j=0;j&110;j++)&& &for(k=0;k&i;k++); }
&void led_init()
{ & P1DIR|=(1&&6); //P1.6为LED }
//--------------------------
void timer_init()
&{ & TACCR0 =62500;& //计到62500,约500ms &
&TACTL = TASSEL_2+ID_3+MC_1+TACLR;& //设置TIMERA的时钟源为SMCLK(1M),8分频后(125K),计数模式为up,到CCR0再自动从0开始计数 &
&TACCTL0 |= CCIE;&&&&&&&&&&&&&&&&&&&&&&&&&&&& // CCR0 interrupt enabled }
&//--------定时器中断函数------------
&#pragma vector=TIMER0_A0_VECTOR __interrupt void Timer_A(void)
&{ & //TACCTL0&=~ CCIE; //关中断 & _EINT();
& cc+=1; & if(cc==2)& //1s=1000ms=2*500 定时
& { && P1OUT^=(1&&6); //P1.6 LED取反 &
&ADC_convert(); & } }
//*************ADC转化及中断程序*********************
void ADC_convert()
&{//static unsigned int results[num_of_results] = {0};&&//&& static //静态变量&&&
& _BIS_SR(GIE); & ADC10CTL1 = INCH_5 + CONSEQ_1;&&&&&&&&&&& // A3/A2/A1, single sequence
& ADC10CTL0 = ADC10SHT_2 + MSC + ADC10ON + ADC10IE + REFON + REF2_5V ;
& ADC10DTC1 = 0x0c;&&&&&&&&&&&&&&&&&&&&&&&& // 3 conversions &
ADC10AE0 |= 0x38;&&&&&&&&&&&&&&&&&&&&&&&& // P1.3,2,1 ADC10 option select &
P1DIR |= 0x01;&&&&&&&&&&&&&&&&&&&&&&&&&&& // Set P1.0 output
&& _EINT();
&&&&& ADC10CTL0 &= ~ENC; &&&
while (ADC10CTL1 & BUSY);&&&&&&&&&&&&&& // Wait if ADC10 core is active && // ADC10SA = 0x200;&&&&&&&&&&&&&&&&&&&&&&& // Data buffer start &&
// for(index=0;index&12;index+=6) &&&
{ ADC10SA = (uint)a;//[index++] ;&&&&&&&&&&& //(uint)a &&& } &
&&& P1OUT |= 0x01;&&&&&&&&&&&&&&&&&&&&&&&&& // P1.0 = 1 &&& // delay(2500); &&
&&&&& ADC10CTL0 |= ENC + ADC10SC;&&&&&&&&&&&& // Sampling and conversion start &&&
&__bis_SR_register(GIE);&&&&&&& // LPM0, ADC10_ISR will force exit& CPUOFF + &&&
P1OUT &= ~0x01;&&&&&&&&&&&&&&&&&&&&&&&& // P1.0 = 0 && // delay(25000);& }
// ADC10中断服务程序
&#pragma vector=ADC10_VECTOR
__interrupt void ADC10_ISR(void)
&{&& _EINT(); & /*static unsigned char index = 0;//静态变量 & results[index++] = ADC10SA;//移动ADC结果到results数组ADC10MEM & if(index == 5)//是否转换了100次 & { &&& index = 0;& &&& flag = 1; & } */ &&
_BIS_SR(GIE); && LPM0_EXIT; // 退出低功耗模式0& ADC10IFG }
//************主函数***************************
&void main()
{ & WDTCTL = WDTPW + WDTHOLD;&&&&&&&&& // Stop WDT &
&BCSCTL1 = CALBC1_1MHZ; &
&DCOCTL = CALDCO_1MHZ; &
&_DINT() ; //关闭中断
& led_init(); &&
&timer_init(); &
& _EINT();&&&&&&&&&&&&&& //开总中断 _BIS_SR(GIE);
&& for(;;) & { & ; & } }
You have posted to a forum that requires a moderator to approve posts before they are publicly available.1095人阅读
其它(28)
这几天有事,耽误了几天。今天好好把ADC研究了一下。前几天写了一个单通道单词转换的AD程序,后来发现,只用单通道的话太浪费资源了。今天就把程序改进了一下,用了两个模拟输入口(再加几个输入口是一样的,今天只是为了测试程序),输出用lcd1602显示转换后的数字量和电压&#20540;。这样一来,咱们就可以用1个AD来转换10种不同的模拟信号了。把程序先贴出来,附件在下面,供大家参考下。有不足的地方,请大家指正哦。不懂的地方也可以跟帖,咱们一起讨论。
//**************************************************//
//**********ADC10双通道A0、A1采样*******************//
//*******通过ADC将两路模拟信号转换为数字信号********//
//*******通过lcd1602显示转换以后的数字量和电压&#20540;****//
//********--------------------------- *******************//
//****--&|P1.0(ADC)& &(lcdrs)P1.6|--&& && && && & *********//
//****--&|P1.1(ADC)&&(lcden)P1.7|--&& && && && &*********//
//****& & |& && && && && && && && && &P2.0|--&D0(lcd)&&*********//
//****& & |& && && && && && && && && && &~ |& &~& && && &&&*********//
//****& & |& && && && && && && && && &P2.7|--&D7(lcd) *********//
//****& & |& && &&&msp430g2553& &&&|& && && && && &*********//
//*******& &&&制作人:wusong& & *******************//
//************************************ ********//
#include&msp430g2553.h&
#include&1602.h&
#define uint unsigned int
#define uchar unsigned char
uchar table_num[]={&&};
uint a[8],b[2],c,d,c_ge,c_shi,c_bai,c_qian,d_ge,d_shi,d_bai,d_
uint i,j,num_1,num_0;
void display()
&&delay_Nms(500);
&&num_1=(int)(b[0]*1.08);//根据需要,可以更改这里的数&#20540;,将量程调到0~1024
&&num_0=(int)(b[1]*1.08);//根据需要,可以更改这里的数&#20540;,将量程调到0~1024
&&c=(int)(num_1*3.3);//转换为电压&#20540;
&&c_ge=c/1000;
&&c_shi=c%;
&&c_bai=c%100/10;
&&c_qian=c%10;
&&d=(int)(num_0*3.3);//转换为电压&#20540;
&&d_ge=d/1000;
&&d_shi=d%;
&&d_bai=d%100/10;
&&d_qian=d%10;
&&write_com(0x80);
&&write_data(table_num[num_1/1000]);
&&write_data(table_num[num_1%]);
&&write_data(table_num[num_1%100/10]);
&&write_data(table_num[num_1%10]);
&&write_data('=');
&&write_data(table_num[c_ge]);
&&write_data('.');
&&write_data(table_num[c_shi]);
&&write_data(table_num[c_bai]);
&&write_data(table_num[c_qian]);
&&write_data('V');&&
&&write_com(0x80&#43;0x40);
&&write_data(table_num[num_0/1000]);
&&write_data(table_num[num_0%]);
&&write_data(table_num[num_0%100/10]);
&&write_data(table_num[num_0%10]);
&&write_data('=');
&&write_data(table_num[d_ge]);
&&write_data('.');
&&write_data(table_num[d_shi]);
&&write_data(table_num[d_bai]);
&&write_data(table_num[d_qian]);
&&write_data('V');
void main()
&&WDTCTL=WDTPW&#43;WDTHOLD;//关看门狗
&&P2SEL=0x00;//P2为I/O模式
&&P2DIR|=0//P2为LCD输出
&&P1DIR|=BIT6&#43;BIT7;//P1.6和P1.7为LCD的输出
&&P1SEL|=BIT1&#43;BIT2;//P1.1和P1.2设置为ADC功能A1和A2
&&ADC10CTL1|=CONSEQ_3&#43;INCH_1;//序列通道单次转换&#43;最大通道为A1
&&ADC10CTL0|=ADC10SHT_2&#43;MSC&#43;ADC10ON&#43;ADC10IE;
&&ADC10DTC1|=0x08;//一共采样8次
&&ADC10AE0|=BIT0&#43;BIT1;//打开A0和A1的模拟输入通道
&&init_lcd();//lcd初始化
&&while(1)
& & ADC10CTL0&=~ENC;//关闭采样使能
& & while(ADC10CTL1&BUSY);//检测AD是否繁忙
& & ADC10CTL0|=ENC&#43;ADC10SC;//启动ADC
& & ADC10SA=(unsigned int)a;//获取a[]的首地址。首先对A1、A0采样,放入a[0]和a[1]中。再对A1、A0采样,放入a[2]和a[3]中,如此循环下去。
& & _BIS_SR(LPM0_bits&#43;GIE);//低功耗模式0,开中断
& &&&for(i=0;i&2;i&#43;&#43;)
& && &b=0;
& && &for(j=0;j&4;j&#43;&#43;)
& && &&&b&#43;=a[i&#43;j*2];
& & for(i=0;i&2;i&#43;&#43;)
& && &b=b/4;
&&display();//lcd显示
#pragma vector=ADC10_VECTOR
__interrupt void ADC(void)
& &&&LPM0_EXIT;//退出低功耗模式
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:246808次
积分:2760
积分:2760
排名:第11416名
原创:35篇
转载:52篇
评论:68条
(2)(1)(2)(2)(2)(2)(2)(4)(12)(4)(3)(1)(6)(2)(7)(1)(15)(12)(1)(6)百度拇指医生
&&&普通咨询
您的网络环境存在异常,
请输入验证码
验证码输入错误,请重新输入MSP430G2553 ADC10四通道四次采样
单片机&嵌入式
单片机应用
嵌入式操作系统
学习工具&教程
学习和开发单片机的必备工具
(有问必答)
(带你轻松入门)
电子元件&电路模块
当前位置: >>
>> 浏览文章
MSP430G2553 ADC10四通道四次采样
#include &msp430g2553.h&
unsigned int adc_temp[16];
unsigned int adc[4];
void init_adc()
&&& ADC10CTL0 &= ~ENC;
&&& ADC10CTL1 = CONSEQ_3 + INCH_3;
&&& ADC10CTL0 = ADC10SHT_3 + MSC + ADC10ON + ADC10IE;
&&& ADC10DTC1 = 0x10;
&&& ADC10AE0 |= BIT0+BIT1+BIT2+BIT3;
void main()
&&& WDTCTL = WDTPW + WDTHOLD;
&&& init_adc();
&&& while(1)
&&&&&&& ADC10CTL0 &= ~ENC;
&&&&&&& while (ADC10CTL1 & BUSY);
&&&&&&& ADC10SA = (unsigned int)adc_
&&&&&&& ADC10CTL0 |= ENC + ADC10SC;
&&&&&&& __bis_SR_register(LPM0_bits + GIE);
&&&&&&& for(i=0;i&4;i++)
&&&&&&& adc[i]=(adc_temp[i]+adc_temp[i+4]+adc_temp[i+8]+adc_temp[i+12])&&2;
#pragma vector=ADC10_VECTOR
__interrupt void adc_isr()
&&& __bic_SR_register_on_exit(LPM0_bits);
【】【】【】【】
上一篇:下一篇:
CopyRight @
单片机教程网
, All Rights Reserved

我要回帖

更多关于 stm8adc采集电压程序 的文章

 

随机推荐