打印
[MCU]

采集电池电压

[复制链接]
419|15
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
houcs|  楼主 | 2020-6-2 20:33 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
该例程是利用249的P6.3/A3口来采集电池电压的,故其想换程序代码如下:
void ad_init()
{
  P6SEL = 0x08;
  ADC12CTL0 &= ~ENC; //使AD模块处于初始状态
  ADC12CTL0|=MSC+ADC12ON+SHT0_2+REF2_5V+REFON; //采样保持时间为16个ADC12CLK  
}
/****************************************************************************
设置转换模式
adr:转换的首地址。取值范围为0~15
mod:转换模式。0:单通道单次  1:序列通道单次  2:单通道多次  3:序列通道多次
****************************************************************************/
void AdcDo(unsigned int adr,unsigned char mod)
{
  ADC12CTL1 = (adr<<12)+SHP+(mod<<1);   //SHP表示由采样定时器控制采样
}
void ad_open(uint x)
{
  ad_flag =1;
  AdcDo(3,0);                   //开始转换的寄存器为ADC12MEM2
  ADC12CTL0 &= ~ENC;   
  ADC12MCTL3 = SREF_1 + x + 0x80;   // 参考电压选择,输入通道
  ADC12IE |=0x08;              //使能转换中断   
  ADC12CTL0 |= ENC;         //允许转换
  ADC12CTL0 |= ENC+ADC12SC; //转换开始  
}
//读取转换结果的底层程序:
uint ad_read()
{
   task_uart0.flag =0x01;   
    wdt_number =0;
    wdt_temp   =30;  
    inter_flag1 =0x01;
    TBCCTL0 |=CCIE;
  while(ad_flag)           //等待转换完 ,最长1.5s,若没转换完,直接跳过
  {
    if(task_uart0.flag ==0)
      ad_flag =0;
  }
  task_uart0.flag =0;   
  return ad_value;         
}
//关闭ADC模块底层程序:
void ad_close()
{
  ADC12CTL0 &= ~(ADC12ON+REFON);  //不允许转换
  ADC12CTL0 &= ~ENC;
}
#pragma  vector=ADC12_VECTOR
__interrupt  void ADC12ISR(void)
{
  ad_value=ADC12MEM3;//读取ADC值  
  ad_flag=0;
}

  unsigned int adc_voltage[11];                //主程序中调用上述采集子程序将采集的结果存入该RAM中
   for(char k=0;k<11;k++)
   {
     ad_open(3);                             
     wdt_time =0;     
     adc_voltage[k]=ad_read();
     for(int i=0;i<1000;i++);
   }
   ad_close();

注意,要改用其他端口采集的时候,一定要注意各个寄存器的配置

使用特权

评论回复

相关帖子

沙发
llljh| | 2020-6-2 20:38 | 只看该作者
建议楼主能够使用定时器来启动ad采样这样就省事多了

使用特权

评论回复
板凳
yinxiangh| | 2020-6-2 20:41 | 只看该作者
看楼主的意思,当药用到其他端口采集数据的时候,能否把一些需要注意的相关的寄存器的给着重标出来额,谢谢

使用特权

评论回复
地板
ousj| | 2020-6-2 20:44 | 只看该作者
这代码的看似很完整的啊,下边的信号采集函数调用的就是简单了点啊

使用特权

评论回复
5
houcs|  楼主 | 2020-6-2 20:48 | 只看该作者
unsigned int adc_voltage[11];                //主程序中调用上述采集子程序将采集的结果存入该RAM中
   for(char k=0;k<11;k++)
   {
     ad_open(3);                             
     wdt_time =0;     
     adc_voltage[k]=ad_read();
     for(int i=0;i<1000;i++);
   }
   ad_close();
各位大虾的,这个程序代码的主体调用就是这部分的,先open AD,采集完后再close AD,就比较省电了啊

使用特权

评论回复
6
houcs|  楼主 | 2020-6-2 20:51 | 只看该作者
ADC12CTL1  ADC12MCTLx   ADC12IE  ADC12CTL0  ADC12MEMx 主要就涉及到这几个相关的寄存器,用其他端口采集信号的时候,注意涉及到的这几个寄存器加以改变就行了

使用特权

评论回复
7
zhanglli| | 2020-6-2 20:55 | 只看该作者

谢谢楼主了啊,讲解的比较透彻的啊,明白了

使用特权

评论回复
8
zhuhuis| | 2020-6-2 20:59 | 只看该作者
如何将转换得到的结果传输到USB接口,然后传到pc机上?

使用特权

评论回复
9
juventus9554| | 2020-6-2 21:02 | 只看该作者
最近在做关于波形采集的硬件课设,求楼主给出相应的代码,用的是TUSB3410的接口

使用特权

评论回复
10
dingy| | 2020-6-2 21:06 | 只看该作者
通过单片机采集转换后的数据为16进制的数据啊,该数据要想通过USB接口传输到PC机,请问你是否还需要设计下USB的硬件电路

使用特权

评论回复
11
liuzaiy| | 2020-6-2 21:09 | 只看该作者
是否还需要知道USB的通讯协议,把USB通讯这一块的也整清楚啊,关于USB通讯这一块的,我也没实际搞过,只进行过利用串口同PC机通讯,这个很方便的啊

使用特权

评论回复
12
lium| | 2020-6-2 21:13 | 只看该作者
请问楼主,如果采用定时器启动和中断的话,应该怎么改?

使用特权

评论回复
13
zhuww| | 2020-6-2 21:16 | 只看该作者
我弄了好就得msp430f249的AD转换程序了。想用protues仿真。用1602显示,但是一直显示不出AD转换的数据。不知道原因啊,请问你用protuse仿真过吗?

使用特权

评论回复
14
wenfen| | 2020-6-2 21:22 | 只看该作者
最近在ADC12 序列多通道的程序上遇到了点麻烦,现只会单次单通道,序列多通道不太会修改程序?

使用特权

评论回复
15
stly| | 2020-6-2 21:25 | 只看该作者
官网有例程的

使用特权

评论回复
16
houcs|  楼主 | 2020-6-2 21:28 | 只看该作者

嗯,我再好好缕一缕吧,有了好消息及时通知大家

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

743

主题

8382

帖子

5

粉丝