本帖最后由 jinglixixi_457498010 于 2022-12-31 23:12 编辑

在温控过程中,为了能更好地了解控制器的工作状态,可以为其添加一个波形显示功能,见图1所示。
其使用的显示屏为2.2寸的TFT屏,显示分辨率为320*240像素点,以SPI接口的方式工作。
image.png
1  波形显示型微控器
该显示屏与开发板的连接关系为:
SCL---PB12
SDA---PB13
RST---PB14
DC ---PB15
CS ---PB9
BL ---VDD

其引脚输出高低电平的语句定义为:
#define LCD_SCK_High()   GPIO_WriteBit(GPIOB, GPIO_PIN_12, 1u)  //CLK
#define LCD_SCK_Low()    GPIO_WriteBit(GPIOB, GPIO_PIN_12, 0u)
#define LCD_SDI_High()   GPIO_WriteBit(GPIOB, GPIO_PIN_13, 1u)  //DIN
#define LCD_SDI_Low()    GPIO_WriteBit(GPIOB, GPIO_PIN_13, 0u)
#define LCD_REST_High()  GPIO_WriteBit(GPIOB, GPIO_PIN_14, 1u)  //RES
#define LCD_REST_Low()   GPIO_WriteBit(GPIOB, GPIO_PIN_14, 0u)
#define LCD_DC_High()    GPIO_WriteBit(GPIOB, GPIO_PIN_9, 1u)   //DC
#define LCD_DC_Low()     GPIO_WriteBit(GPIOB, GPIO_PIN_9, 0u)
#define LCD_CS_High()    GPIO_WriteBit(GPIOB, GPIO_PIN_15, 1u)  //CS
#define LCD_CS_Low()     GPIO_WriteBit(GPIOB, GPIO_PIN_15, 0u)
相应的引脚功能配置函数为:
  1. void tft_app(void)
  2. {
  3.     gpio_init.Pins  = GPIO_PIN_9|GPIO_PIN_12|GPIO_PIN_13|GPIO_PIN_14|GPIO_PIN_15;
  4.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  5.     gpio_init.Speed = GPIO_Speed_50MHz;
  6.     GPIO_Init(GPIOB, &gpio_init);
  7.     GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_15);
  8. }

该显示屏的初始化函数为:
  1. void tft_Init(void)
  2. {
  3.     LCD_REST_Low();
  4.     app_delay(40);
  5.     LCD_REST_High();
  6.     app_delay(40);
  7.     LCD_CS_Low();  
  8.     LCD_WR_REG(0xCB);
  9.     LCD_WR_DATA8(0x39);
  10.     LCD_WR_DATA8(0x2C);
  11.     LCD_WR_DATA8(0x00);
  12.     LCD_WR_DATA8(0x34);
  13.     LCD_WR_DATA8(0x02);
  14.     LCD_WR_REG(0xCF);  
  15.     LCD_WR_DATA8(0x00);
  16.     LCD_WR_DATA8(0XC1);
  17.     LCD_WR_DATA8(0X30);
  18.     LCD_WR_REG(0xE8);  
  19.     LCD_WR_DATA8(0x85);
  20.     LCD_WR_DATA8(0x00);
  21.     LCD_WR_DATA8(0x78);
  22.     LCD_WR_REG(0xEA);  
  23.     LCD_WR_DATA8(0x00);
  24.     LCD_WR_DATA8(0x00);
  25.     LCD_WR_REG(0xED);  
  26.     LCD_WR_DATA8(0x64);
  27.     LCD_WR_DATA8(0x03);
  28.     LCD_WR_DATA8(0X12);
  29.     LCD_WR_DATA8(0X81);
  30.     LCD_WR_REG(0xF7);  
  31.     LCD_WR_DATA8(0x20);
  32.     LCD_WR_REG(0xC0);
  33.     LCD_WR_DATA8(0x23);
  34.     LCD_WR_REG(0xC1);
  35.     LCD_WR_DATA8(0x10);
  36.     LCD_WR_REG(0xC5);
  37.     LCD_WR_DATA8(0x3e);
  38.     LCD_WR_DATA8(0x28);
  39.     LCD_WR_REG(0xC7);
  40.     LCD_WR_DATA8(0x86);
  41.     LCD_WR_REG(0x36);
  42.     LCD_WR_DATA8(0x48);
  43.     LCD_WR_REG(0x3A);
  44.     LCD_WR_DATA8(0x55);
  45.     LCD_WR_REG(0xB1);
  46.     LCD_WR_DATA8(0x00);
  47.     LCD_WR_DATA8(0x18);
  48.     LCD_WR_REG(0xB6);
  49.     LCD_WR_DATA8(0x08);
  50.     LCD_WR_DATA8(0x82);
  51.     LCD_WR_DATA8(0x27);
  52.     LCD_WR_REG(0xF2);
  53.     LCD_WR_DATA8(0x00);
  54.     LCD_WR_REG(0x26);
  55.     LCD_WR_DATA8(0x01);
  56.     LCD_WR_REG(0xE0);
  57.     LCD_WR_DATA8(0x0F);
  58.     LCD_WR_DATA8(0x31);
  59.     LCD_WR_DATA8(0x2B);
  60.     LCD_WR_DATA8(0x0C);
  61.     LCD_WR_DATA8(0x0E);
  62.     LCD_WR_DATA8(0x08);
  63.     LCD_WR_DATA8(0x4E);
  64.     LCD_WR_DATA8(0xF1);
  65.     LCD_WR_DATA8(0x37);
  66.     LCD_WR_DATA8(0x07);
  67.     LCD_WR_DATA8(0x10);
  68.     LCD_WR_DATA8(0x03);
  69.     LCD_WR_DATA8(0x0E);
  70.     LCD_WR_DATA8(0x09);
  71.     LCD_WR_DATA8(0x00);
  72.     LCD_WR_REG(0XE1);
  73.     LCD_WR_DATA8(0x00);
  74.     LCD_WR_DATA8(0x0E);
  75.     LCD_WR_DATA8(0x14);
  76.     LCD_WR_DATA8(0x03);
  77.     LCD_WR_DATA8(0x11);
  78.     LCD_WR_DATA8(0x07);
  79.     LCD_WR_DATA8(0x31);
  80.     LCD_WR_DATA8(0xC1);
  81.     LCD_WR_DATA8(0x48);
  82.     LCD_WR_DATA8(0x08);
  83.     LCD_WR_DATA8(0x0F);
  84.     LCD_WR_DATA8(0x0C);
  85.     LCD_WR_DATA8(0x31);
  86.     LCD_WR_DATA8(0x36);
  87.     LCD_WR_DATA8(0x0F);
  88.     LCD_WR_REG(0x11);
  89.     app_delay(200);
  90.     LCD_WR_REG(0x29);
  91.     LCD_WR_REG(0x2c);
  92. }

为了实现波形的绘制,其绘制直线的函数为:
  1. void LCD_DrawLine(unsigned int x1, unsigned int y1, unsigned int x2, unsigned int y2)
  2. {
  3.        unsigned int t;
  4.        int xerr=0,yerr=0,delta_x,delta_y,distance;
  5.        int incx,incy,uRow,uCol;
  6.        delta_x=x2-x1;  
  7.        delta_y=y2-y1;
  8.        uRow=x1;
  9.        uCol=y1;
  10.        if(delta_x>0)incx=1;  
  11.        else if(delta_x==0)incx=0;
  12.        else {incx=-1;delta_x=-delta_x;}
  13.        if(delta_y>0)incy=1;
  14.        else if(delta_y==0)incy=0;
  15.        else{incy=-1;delta_y=-delta_y;}
  16.        if( delta_x>delta_y)distance=delta_x;
  17.        else distance=delta_y;
  18.        for(t=0;t<=distance+1;t++ )
  19.        {
  20.             LCD_DrawPoint(uRow,uCol);
  21.             xerr+=delta_x ;
  22.             yerr+=delta_y ;
  23.             if(xerr>distance)
  24.             {
  25.                  xerr-=distance;
  26.                  uRow+=incx;
  27.             }
  28.             if(yerr>distance)
  29.             {
  30.                  yerr-=distance;
  31.                  uCol+=incy;
  32.             }
  33.      }
  34. }

为了进行参数设置和工作状态指示,还用到了板载的LED和KEY,其电路见图2所示。
image.png
图2  LED与KEY电路


其中,黄色的LD3用于指示热能释放状态,蓝色的LD2用于指示加热状态。
为此,LED灯的引脚配置函数为:
  1. void Init_led(void)
  2. {
  3.     gpio_init.Pins  = GPIO_PIN_11;
  4.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  5.     gpio_init.Speed = GPIO_Speed_50MHz;
  6.     GPIO_Init(GPIOB, &gpio_init);
  7.     GPIO_PinAFConf(GPIOB, gpio_init.Pins, GPIO_AF_15);
  8.         
  9.     gpio_init.Pins  = GPIO_PIN_0;
  10.     gpio_init.PinMode  = GPIO_PinMode_Out_PushPull;
  11.     gpio_init.Speed = GPIO_Speed_50MHz;
  12.     GPIO_Init(GPIOC, &gpio_init);
  13.     GPIO_PinAFConf(GPIOC, gpio_init.Pins, GPIO_AF_0);
  14.     GPIO_WriteBit(GPIOB, GPIO_PIN_11, 1u);
  15.     GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u);
  16. }


实现整体设计功能的主程序为:
  1. int main(void)
  2. {
  3.      uint32_t i,f,m;
  4.      float  u,p,V;     
  5.      BOARD_Init();
  6.      tft_app();
  7.      tft_Init();
  8.      LCD_Clear(YELLOW);
  9.      app_delay(200);
  10.      BACK_COLOR=YELLOW;
  11.      POINT_COLOR=RED;
  12.      LCD_ShowString(80,30,"EVB-L0136 & NTC");
  13.      show_tb(60,20,0);
  14.      POINT_COLOR=RED;
  15.      LCD_ShowString(50,80,"ADC:     mV");
  16.      LCD_ShowString(50,100,"Temp:    C");
  17.      LCD_ShowString(150,80,"time:    ");
  18.      LCD_ShowString(150,100,"Max:    C");
  19.      POINT_COLOR=RED;
  20.      LCD_DrawLine(20, 300, 230, 300);
  21.      LCD_DrawLine(20, 300, 20, 100);
  22.      LCD_DrawLine(16, 270, 20, 270);
  23.      LCD_DrawLine(16, 240, 20, 240);
  24.      LCD_DrawLine(16, 210, 20, 210);
  25.      LCD_DrawLine(16, 180, 20, 180);
  26.      LCD_DrawLine(16, 150, 20, 150);
  27.      f=1;
  28.      Init_key();
  29.      Init_led();
  30.      POINT_COLOR=BLUE;
  31.      i=0;
  32.     while (f)
  33.     {
  34.           if(GPIO_ReadInDataBit(GPIOB, GPIO_PIN_2)==1) i=i-1;          // K1
  35.           if(GPIO_ReadInDataBit(GPIOD, GPIO_PIN_5)==0) i=(i+1)%3300;   // K2
  36.           if(GPIO_ReadInDataBit(GPIOA, GPIO_PIN_8)==0) i=(i*10)%3300;  // K3
  37.           if(GPIO_ReadInDataBit(GPIOB, GPIO_PIN_5)==0) f=0;           // K4
  38.           LCD_ShowNum(180,100,i,3);
  39.           app_delay(20);
  40.     }
  41.     m=i;
  42.     app_adc_init();
  43.     p=0;
  44.     i=0;
  45.     V=0;
  46.     while (1)
  47.     {
  48.         u=(unsigned)(app_adc_run_conv() & 0xFFF);
  49.         u=3300*u/4095;
  50.         LCD_ShowNum(82,80,u,4);
  51.         LCD_ShowNum(190,80,i,3);
  52.         ...
  53.         if((u<=1644)&&(u>1268)) V=10+(1644-u)/37;
  54.         if((u<=1268)&&(u>947)) V=20+(1268-u)/32;
  55.         if((u<=947)&&(u>692)) V=30+(947-u)/25;
  56.         ...
  57.         LCD_ShowNum(90,100,V,3);  
  58.         LCD_DrawLine(20+i*4, 300-(p*3), 24+i*4,300-(V*3));
  59.         p=V;
  60.         i=i+1;
  61.         if(i>48)
  62.         {
  63.              LCD_Fill(21,120,219,299,YELLOW);
  64.              i=0;
  65.              p=0;
  66.         }
  67.         if(V<m)
  68.         {
  69.              GPIO_WriteBit(GPIOB, GPIO_PIN_11, 0u);
  70.              GPIO_WriteBit(GPIOC, GPIO_PIN_0, 1u);
  71.              app_delay(200);
  72.         }
  73.         else
  74.         {
  75.              GPIO_WriteBit(GPIOB, GPIO_PIN_11, 1u);
  76.              GPIO_WriteBit(GPIOC, GPIO_PIN_0, 0u);
  77.         }
  78.         app_delay(200);
  79.     }
  80. }

经程序的编译下载,其运行效果如图3和图4所示。
其中图3是控制器处于室温状态,用于其低于设定值20度,故蓝色指示灯被点亮。
图4则是微控器处于室温后的热能释放状态,故黄色指示灯被点亮。

image.png
图3 室温状态检测

image.png
图4 热释放状态