如何将 AnalogRead 添加到 ATMega 2560 的 optiboot 引导加载程序?

问题描述 投票:0回答:1

我有一个带有 Mega 2560 的定制 PCB。我使用 optiboot 作为引导加载程序,并做了一些更改。 如果完成软重置,我已经准备好进入引导加载程序了。

现在我想进入引导加载程序,如果 5V 引脚为高电平且 AnalogRead(pinBattery) <100. So if I don't have battery in and I plug the charger to enter in bootloader. Just to have an alternative emergency method to enter in bootloader if firmware update fails and I cannot cause a soft reset.

但是我无法在optiboot中实现模拟读取。 我的电池引脚是PF1。 我的 5v 引脚是 PF3。

#define BATTERY_PIN 1 // Analog pin for reading battery voltage (PF1)
#define FIVEV_PIN 3   // Digital pin connected to 5V line (PF3)

PCB 使用外部晶体以 8Mhz 运行。 电路工作电压为3.3V

我尝试模拟初始化的代码是这样的。

    // Configure pins
DDRF &= ~(1 << BATTERY_PIN); // Set battery pin as input
DDRF &= ~(1 << FIVEV_PIN);    // Set 5V pin as input
int batteryVoltage = readBatteryVoltage();

读取的电池电压是这样的

int readBatteryVoltage() {
    // Read analog value from battery pin
    ADCSRA |= (1 << ADEN); // Enable ADC
    ADMUX = (0 << REFS1) | (1 << REFS0) | BATTERY_PIN; // Select AVCC as reference, set battery pin as input
    ADCSRA |= (1 << ADSC); // Start conversion
    while (ADCSRA & (1 << ADSC)); // Wait for conversion to complete
    return ADC; // Return ADC value
}

如果会进入bootloader

ch = MCUSR;
if ((ch & _BV(WDRF)) || ((PINF & (1 << PF3)) && (batteryVoltage<100)))  {

我已经使用我的主程序检查了读数。 如果没有电池,Arduino AnalogRead(BATTERY_PIN) 返回 0,digitalRead 返回 1。程序一启动就满足这些条件。 我无法使用 digitalRead(BATTERY_PIN),因为它在电池电量低时返回 0。 没有其他办法,添加按钮等。 我没有很深的知识,我在人工智能的帮助下写下了以上几行。 我的引导加载程序中有空间。很多。 我也尝试包含 Arduino.h 但它也不起作用。

提前谢谢您。

bootloader arduino-c++ adc
1个回答
0
投票

这对我有用。我将其发布在这里以防有人需要。我直接从通道 1 读出。我调用 InitADC,然后可以使用 ReadADC1() 获取通道 1 的模拟读数。 Mega2560 以 8Mhz 和 3.3V 运行。

uint16_t ReadADC1(){
// Select ADC channel 1 (corresponding to PF1)
ADMUX = (ADMUX & 0xF0) | 0x01;

// Start single conversion mode
ADCSRA |= (1 << ADSC);

// Wait until ADC conversion is complete
while (ADCSRA & (1 << ADSC));

// Read ADC result (combine ADCL and ADCH)
uint16_t adcResult = ADCL; // Read ADCL first (important!)
adcResult |= (ADCH << 8); // Combine ADCL and ADCH

return adcResult;

void InitADC(){
// Select Vref=AVcc
ADMUX |= (1<<REFS0);
//set prescaller to 128 and enable ADC 
ADCSRA |= (1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0)|(1<<ADEN);    

}

© www.soinside.com 2019 - 2024. All rights reserved.