本人刚接触map430不久,在定时器和ad采样方面有很多问题,希望高手帮忙解答。
目的:实现定时器A0触发ADC10每隔一段时间采样,其他时间cpu有别的事干,采样对象为湿度传感器传回的电压值(0v~2.1v)。
问题:1、低功耗LPM0模式下cpu停止,怎么还能执行main函数中的指令?
2、如何实现定时器A0触发ADC10每隔一段时间采样?求程序。 (这是主要问题)
3、从ADC10MEM中读出的数据如何转化成0~100的数值,如何建立公式?
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.
本人刚接触map430不久,在定时器和ad采样方面有很多问题,希望高手帮忙解答。
目的:实现定时器A0触发ADC10每隔一段时间采样,其他时间cpu有别的事干,采样对象为湿度传感器传回的电压值(0v~2.1v)。
问题:1、低功耗LPM0模式下cpu停止,怎么还能执行main函数中的指令?
2、如何实现定时器A0触发ADC10每隔一段时间采样?求程序。 (这是主要问题)
3、从ADC10MEM中读出的数据如何转化成0~100的数值,如何建立公式?
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.
我想实现用定时器隔段时间进行ad10多通道采样,可是只能一次采集,还有好像进不了adc10的中断,求助
#include "msp430g2553.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;
unsigned char flag;
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取反
cc=0;
ADC_convert(); } }
//*************ADC转化及中断程序*********************
void ADC_convert()
{//static unsigned int results[num_of_results] = {0}; // static unsigned char index ;//静态变量
_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(;;) { ; } }