基于AVR64DD32实现加热和温度采集系统
本项目是基于AVR64DD32实现加热和温度采集系统,完成动态加热测量温度的变化并根据测量到的温在LCD屏幕上绘制温升曲线,截图保存等功能。
标签
嵌入式系统
Funpack活动
显示
AVR
maskmoo
更新2023-05-05
358

项目描述

基于AVR64DD32实现加热和温度采集系统

  • IO扩展板上有一处加温电阻,通过电流给电阻加热
  • 并通过温度传感器感知板上温度的变化
  • 将测量到的温度信息显示在LCD屏幕上,绘制一个1分钟的温升曲线。
  • 并且每隔1分钟改变加热电阻的占空比,重复温度测量和绘制的过程。
  • 板上有一处RGB彩灯,当温度超过50°C时转为红色,低于20°C时转为蓝色,正常状态下为绿色。
  • 按下按键时,截图当前的温升曲线。

FjYyI0Z9RTgbTVQTS9kCGqQ9Xp73

程序流程图

FnoSHSXfhbWRWLndKCy3CPR6aIMj

引脚连接

AVR64DD32 External Board
PF2 LEDR
PF3 LEDG
PF4 LEDB
PF6 KEY
PA6 LCD_CLK
PA4 LCD_DAT
PC3 LCD_RST
PC2 LCD_DC
PC1 LCD_CS
PA2 SENSOR_SDA
PA3 SENSOR_SCL
PC0 PWM_OUT

功能实现

1 按键输入检测

通过对输入引脚进行检测,来判断是否刷新屏幕,进而实现屏幕截图功能。

FodvgGba2QoJBedE771PmvIWo5dP

uint8_t PF6_PRESS_FLAG = 0;
void PF6_DefaultInterruptHandler(void)
{
    // add your PF6 interrupt custom code
    // or set custom function using PF6_SetInterruptHandler()
    printf("\r\n Key Pressed");
    PF6_PRESS_FLAG++;
    PF6_PRESS_FLAG %= 2;
}

2 PWM加热电阻

通过实现不同占空比的PWM信号来驱动加热电阻实现加热的效果快慢。

FoFIkHIqO6XQiW2XCp3vPphPhoeC

void SetPWMDuty(int duty){
    if(duty==0){
        TCA0.SINGLE.CMP0BUF = 0;
    }
    else
    {
        TCA0.SINGLE.CMP0BUF = duty/100.0*2999;
    }
    CurrentDutyCycle = duty;
}

4 温升曲线绘制

以LCD画点函数API为基础,通过长度为128的滑动像素缓存来实现温升曲线的动态绘制。

#define TEMP_DATA_COL       128

int temp_data[TEMP_DATA_COL] = {0};
int temp_data_index = 0;


void LCD_DrawPoint_P(uint16_t x,uint16_t y,uint16_t color, uint16_t size){
    if(size>0){
        for(int i=0; i<size+1; i++){
            for(int j=0; j<size+1; j++){
                    LCD_DrawPoint(x+i, y+j,color); 
                }
            }
    }
}

void draw_tempdata(int temp){
      LCD_Fill(0,20,128,108,WHITE);
    temp_data[temp_data_index] = temp;
        for(int i=0;i<TEMP_DATA_COL-temp_data_index-1; i++){
            LCD_DrawPoint_P(i, 128-temp_data[temp_data_index+i],GREEN, 2);
        }
        for(int i=TEMP_DATA_COL-temp_data_index-1; i<TEMP_DATA_COL; i++){
            LCD_DrawPoint_P(i, 128-temp_data[i-(TEMP_DATA_COL-temp_data_index-1)],GREEN, 2);
        }
    temp_data_index++;
    if(temp_data_index>=TEMP_DATA_COL){
        temp_data_index =0;
    }
    
    LCD_DrawLine(0, 28, 0, 128, RED);
    LCD_DrawLine(20, 28, 20, 128, RED);
    LCD_DrawLine(40, 28, 40, 128, RED);
    LCD_DrawLine(60, 28, 60, 128, RED);
    LCD_DrawLine(80, 28, 80, 128, RED);
    LCD_DrawLine(100, 28, 100, 128, RED);
    LCD_DrawLine(120, 28, 120, 128, RED);
    
    LCD_DrawLine(0, 128, 128, 128, RED);
    LCD_DrawLine(0, 108, 128, 108, RED);
    LCD_DrawLine(0, 88, 128, 88, RED);
    LCD_DrawLine(0, 68, 128, 68, RED);
    LCD_DrawLine(0, 48, 128, 48, RED);
    LCD_DrawLine(0, 28, 128, 28, RED);
}

5 RGB-LED驱动

RGB小灯为低电平触发,根据温度传感器采集的温度分别控制3个引脚的开关实现不同颜色的显示。

            if(TemperatureValue>= 50){
                IO_PF2_SetLow();
                IO_PF3_SetHigh();
                IO_PF4_SetHigh();
            }
            else if(TemperatureValue <= 30){
               IO_PF2_SetHigh();
               IO_PF3_SetHigh();
               IO_PF4_SetLow();
            }else{
                IO_PF2_SetHigh();
                IO_PF3_SetLow();
                IO_PF4_SetHigh();
            }

功能展示

FqzBoHhtIOYHlsPktGVLMg1oAkNZFoFcyvOz77kvEA9cwcW_zqEWMCBZ

 

心得体会

通过这次活动了解和学习了AVR64DD32这款芯片以及官方IDE的MCC,整体使用上还是比较方便的,有些类似STM32CubeIDE的感觉,一些图形化配置生成初始化代码的功能都有。但是还是存在几个不尽人意的地方对第一次使用该环境的人来说不是很友好:

1  一些依赖都需要在线安装,如果网络情况不是很好的话会造成很多困扰(这里建议开魔法)

2  错误提示不明显,比如“recipe for target ‘.build-conf‘ failed”。(建议重新Clear and Build,如果还解决不了就检查下代码)

附件下载
funpack2_4.X.zip
团队介绍
基于AVR64DD32实现加热和温度采集系统
团队成员
maskmoo
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2023 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号