AVR开发 Arduino方法(五) 模数转换子系统

  模数转换子系统用于将传感器采集的模拟信号转换为数字信号。Arduino UNO R3主处理器ATMega328P的模数转换子系统采用逐次逼近的方式完成模数转换。

  使用Arduino库函数进行模数转换十分简单,下面的示例可以将A0引脚上的模拟信号转换为数字信号,并将转换结果打印到串口0上: 

 1 // ReadAnalogVoltage.ino
 2 void setup() {
 3   Serial.begin(9600);
 4 }
 5 
 6 void loop() {
 7   int sensorValue = analogRead(A0);
 8   float voltage = sensorValue * (5.0 / 1023.0);
 9   Serial.println(voltage);
10 }

   与模数转换相关的Arduino库函数有:

 

  analogRead(pin):将指定引脚上的模拟信号转换为数字信号

  pin:指定模拟引脚

  函数返回转换结果,是一个无符号整数,取值为0~1023

 

  ATMega328P的模数转换子系统由2个相关寄存器控制。模数转换多路选择寄存器ADMUX的结构如下图所示:

REFS1

REFS0

ADLAR

 

MUX3

MUX2

MUX1

MUX0

输入通道选择MUX[3:0]位用于指定模拟信号输入的引脚,Arduino UNO R3开发板上有6个模拟信号输入引脚,它们分别是A0A5,在ANALOG IN组中。

  模数转换控制和状态寄存器ADCSRA的结构如下图所示:

ADEN

ADSC

ADATE

ADIF

ADIE

ADPS2

ADPS1

ADPS0

向模数转换使能位ADEN写入1则启用模数转换,写入0则禁用;向模数转换启动转换位ADSC写入1则启动模数转换,写入0则不启动;模数转换中断标志位ADIF在被置1时模数转换完成,可以向它写10;模数转换预分频选择位ADPS[2:0]用于设置模数转换的时钟源,它的设置如下表所示:

ADPS[2:0]

时钟源

000

系统时钟2分频

001

系统时钟2分频

010

系统时钟4分频

011

系统时钟8分频

100

系统时钟16分频

101

系统时钟32分频

110

系统时钟64分频

111

系统时钟128分频

  模数转换的结果保存在模数转换数据寄存器ADCHADCL中。通过直接访问寄存器改写以上程序为:

 1 // ReadAnalogVoltage_reg.ino
 2 void setup() {
 3   ADMUX = 0x00;
 4   ADCSRA |= (1 << ADEN);
 5 
 6   Serial.begin(9600);
 7 }
 8 
 9 void loop() {
10   ADCSRA |= (1 << ADSC);
11   while (!(ADCSRA & (1 << ADIF)));
12 
13   int sensorValue = (ADCH << 8) | ADCL;
14   float voltage = sensorValue * (5.0 / 1023.0);
15   Serial.println(voltage);
16   ADCSRA |= (1 << ADIF);
17 }

转载于:https://www.cnblogs.com/lets-blu/p/7530879.html

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我会为您讲解关于AVR开发Arduino方法中的嵌入式操作系统FreeRTOS。 FreeRTOS是一个免费的实时操作系统内核,它提供了一组软件函数,可以用于实现任务管理、调度、同步和通信等功能,可以帮助开发者更轻松地实现嵌入式系统的开发。 在AVR开发中,可以通过在Arduino IDE中安装FreeRTOS库,来使用FreeRTOS。下面是实现FreeRTOS的步骤: 1. 下载FreeRTOS库文件,并将其放到Arduino IDE的库文件夹中。 2. 在Arduino IDE中打开一个新的示例项目,然后在示例项目中添加FreeRTOS库文件。 3. 在代码中使用FreeRTOS库文件提供的函数来创建任务、调度任务、同步和通信等操作。 例如,下面的代码演示了如何使用FreeRTOS创建两个任务,一个任务不断地闪烁LED灯,另一个任务每秒输出一次“Hello World!”: ``` #include <Arduino_FreeRTOS.h> #include <task.h> #define LED_PIN 13 void ledTask(void *pvParameters) { pinMode(LED_PIN, OUTPUT); while (1) { digitalWrite(LED_PIN, HIGH); vTaskDelay(500 / portTICK_PERIOD_MS); digitalWrite(LED_PIN, LOW); vTaskDelay(500 / portTICK_PERIOD_MS); } } void helloWorldTask(void *pvParameters) { while (1) { Serial.println("Hello World!"); vTaskDelay(1000 / portTICK_PERIOD_MS); } } void setup() { Serial.begin(9600); xTaskCreate(ledTask, "LedTask", 128, NULL, 1, NULL); xTaskCreate(helloWorldTask, "HelloWorldTask", 128, NULL, 2, NULL); } void loop() {} ``` 在这个例子中,我们首先定义了两个任务,一个是闪烁LED灯的ledTask,另一个是输出“Hello World!”的helloWorldTask。在setup()函数中,我们使用xTaskCreate()函数创建了这两个任务,并指定了它们的优先级。 在运行时,FreeRTOS会自动调度这两个任务,在它们之间切换执行,从而实现多任务的效果。 以上就是关于AVR开发中使用FreeRTOS的简单介绍,希望对您有所帮助。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值