不一定,AD 转换器按照转换原理可分为直接AD 转换器和间接AD 转换器。所谓直接AD 转换器,是把模拟信号直接转换成数字信号,如逐次逼近型,并联比较型等。其中逐次逼近型AD 转换器,易于用集成工艺实现,且能达到较高的分辨率和速度,故目前集成化AD 芯片采用逐次逼近型者多;间接AD 转换器是先把模拟量转换成中间量,然后再转换成数字量,如电压/时间转换型(积分型)、电压/频率转换型、电压/脉宽转换型等。 其中积分型A/D 转换器电路简单,抗干扰能力强,切能作到高分辨率,但转换速度较慢。 有些转换器还将多路开关、基准电压源、时钟电路、译码器和转换电路集成在一个芯片内,已超出了单纯A/D 转换功能,使用十分方便。
兄弟:不知道你玩不玩32 ,有个32 的在工程上用过,直接刷程序,串口连接电脑就可以输出AD 转换的结果。如果不玩32 的话。
首先第一步排查: 排查单片机能不能正确显示 你测试到的 AD 信号,显示正确不?
比如给他 3V 电压 ,用数码管显示出来。
第二: 串口发送,找个能正确发送数据的代码 ,直接把 ,你检查的数值给这个变量,让串口发送,
一步一步找问题,你绝对能解决的。我把AD0809 的代码给你用数码管测试
#include <reg52h>
#define uint unsigned int
#define uchar unsigned char
uchar code LEDData[]=
{
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f
};
sbit OE = P1^0;
sbit EOC = P1^1;
sbit ST = P1^2;
sbit CLK = P1^3;
void DelayMS(uint ms)
{
uchar i;
while(ms--)
{
for(i=0;i<120;i++);
}
}
void Display_Result(uchar d)
{
P2 = 0xf7;
P0 = LEDData[d%10];
DelayMS(5);
P2 = 0xfb;
P0 = LEDData[d%100/10];
DelayMS(5);
P2 = 0xfd;
P0 = LEDData[d/100];
DelayMS(5);
}
void main()
{
TMOD = 0x02;
TH0 = 0x14;
TL0 = 0x00;
IE = 0x82;
TR0 = 1;
P1 = 0x3f;
while(1)
{
ST = 0;
ST = 1;
ST = 0;
while(EOC == 0);
OE = 1;
Display_Result(P3);
OE = 0;
}
}
void Timer0_INT() interrupt 1
{
CLK = !CLK;
}
这是图纸是硬件组态
下面是程序
CALL FC 117
IN0 :=PIW8 调速杆1 0-10V 对应 0-27648
IN1 :=27648
IN2 :=0
IN3 :=20
IN4 :=-20
OUT5:=MW304
NOP 0
该程序将调速杆1的位置信号0-10V转换为 -20到20的数值
#include <msp430x14xh>
void main(void)
{
WDTCTL = WDTPW+WDTHOLD; // Stop watchdog timer
P6SEL |= 0x01; // Enable A/D channel A0
ADC12CTL0 = ADC12ON+SHT0_2; // Turn on ADC12, set sampling time
ADC12CTL1 = SHP; // Use sampling timer
ADC12MCTL0 = SREF_2; // Vr+ = VeREF+ (external)
ADC12CTL0 |= ENC; // Enable conversions
while (1)
{
ADC12CTL0 |= ADC12SC; // Start conversion
while ((ADC12IFG & BIT0)==0);
_NOP(); // SET BREAKPOINT HERE
}
}
这是TI公司的例程
我最近也在弄STC的单片机,看了下代码,觉得以下这段似乎有点问题
for(i=0;i<10;i++)
{
tp=0;
ADC_RES=0;
ADC_RESL=0; //低两位清零
ADC_CONTR|=0x08; //启动AD转换
while(!tp) //判断AD转换是否完成
{
tp=0x10;
tp&=ADC_CONTR;
}
ADC_CONTR&=0xe7;
ad_average_result=ADC_RES;
q=q+ad_average_result;
}
你的意图是想做10次转换,然后取平均值作为最终结果吧, while(!tp) 就是说转换完成后将转换完成标志位清零接着再取出转换后的数,可是转换未完成的话就跳出while直接执行后面的语句了吧,不过这个就是有问题应该也不会导致完全没结果输出,也就是结果有问题的话灯应该也会亮的,还有是否确定模拟信号输入口是否和寄存器设置所选的一致,P1ASF这个寄存器我也找不到说明
for语句从AdcRegsADCRESULT0采集512个数据(电压模拟值),存于取样表SampleTable数组,同时将采样数据转换成实际电压数值,存放于dianya数组。将512个电压值求平均值,作为当时的电压值(sum先累加再平均)
然后显示出来并且延时。
整个过程无限循环(while(1){})。
请问你想问的是基于simulink的程序开发么?
舵机控制:实验目的:通过可变电阻器电压的大小,控制舵机的运动(运动范围是0-180°)。实验原理:1,要想实现上述目的,需要使用Arduino的模拟输入通道和一个数字通道,模拟输入通道用来检测电压的变化,模拟量0--5V,转化成数字量为0-1023。这是因为Arduino的AD转换是10位的,数字通道是最为舵机的控制,驱动舵机进行动作。2,根据Arduino的通道情况,实验中使用数字通道4作为舵机的控制通道,使用模拟输入4作为模拟电压检测通道。3,由1中可知模拟通道转换之后的值是0-1023,舵机旋转的角度是0-180°。所以要把两个对应起来,简单的做法就是转换后的模拟信号乘以180/1023实验步骤:1, 按照实验原理需要搭建模型,具体如下图所示,这里Simulink模块的添加步骤就不在赘述。
LED闪烁实验:1,首先打开simulink软件,新建一个模型文件,命名test1。2,从Simulink库文件中找到Arduino的模块库,然后添加数字输出通道;从simulink库中找到脉冲发生器模块添加到新建的工程中。3,模型搭建完之后,相关模块进行配置,双击脉冲发生器模块和数字输出模块下图所示;脉冲发生器模块信号幅值设置为1,周期设置2s,占空比设置为50%;由于在Arduino Mega2560板子上,LED是接在数字13号引脚,所以模块设置引脚为13,设置完之后,板子上的LED灯会以2s为周期进行闪烁,亮1s,灭1s。4,模型至此搭建完成,接下来需要对模型进行配置,主要是配置基于Arduino Mega2560生代码的环境。5, 接下来就是生代码,并且把代码编译之后,下载到Arduino Mega2560板子中,然后板子就会按照前面步骤的设置进行闪烁,下载程序之前,首先确保板子和电脑连接上了。6等待一会,下载完毕之后,会看到板子上的LED在闪烁。
以上就是关于利用ad转换器时一定要用程序运行吗全部的内容,包括:利用ad转换器时一定要用程序运行吗、关于单片机向串口发送AD转换结果的程序、plc中ad转换器怎么用,怎么编程,输入个模拟量怎么转换成数字量,并加入到比较器进行比较等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)