[LKS32 软件] [ LKS32MC037E开发板评测 ]+AD采集+段式液晶显示

[复制链接]
1457|9
 楼主| 比神乐 发表于 2023-1-27 13:32 | 显示全部楼层 |阅读模式
今天捣鼓了一下AD采集,用段式液晶显示。
原理图:
0.jpg 1.jpg 2.jpg
看数据手册:
9.jpg
可以看出P0.9属于ADC通道4.
代码:
主程序:
  1. #include "lks32mc03x_lib.h"
  2. #include "hardware_init.h"
  3. #include "delay.h"

  4. /*******************************************************************************
  5. º¯ÊýÃû³Æ£º    int main(void)
  6. ¹¦ÄÜÃèÊö£º    Ö÷³ÌÐòÈë¿Ú
  7. ÊäÈë²ÎÊý£º    ÎÞ         
  8. Êä³ö²ÎÊý£º    ÎÞ
  9. ·µ »Ø Öµ£º    ÎÞ
  10. ÆäËü˵Ã÷£º    ±¾ÊµÑéʹÓÃMCPWMµÄT0ʼþ×÷Ϊ´¥·¢ADCµÚÒ»¶Î²ÉÑùµÄ²ÉÑùʼþ£¬Ê¹ÓÃADC_CH5¼´ADC
  11.               Í¨µÀ5²É¼¯µçλÆ÷µçѹ¡£

  12. ÔËÐÐЧ¹û£º    ³ÌÐòÉÕ¼ÁèŸLKS32MC033H6P8×îСϵͳ°å£¬KEIL5½øÈëdebugģʽ´ò¿ªWatch2´°¿Ú
  13.                ²é¿´ADCDataVolt_Samp0 ADC²É¼¯µçλÆ÷ÊýÖµºÍVoltValue_Samp0µçλÆ÷ʵ¼Êµçѹ
  14.                                                          Öµµ¥Î»V¡£

  15. ÐÞ¸ÄÈÕÆÚ      °æ±¾ºÅ          ÐÞ¸ÄÈË            ÐÞ¸ÄÄÚÈÝ
  16. -----------------------------------------------------------------------------
  17. 2022/4/14     V1.0          HuangMG             ´´½¨
  18. *******************************************************************************/
  19. s16 ADCDataVolt_Samp0 = 0;//ADC²É¼¯µçλÆ÷ÊýÖµ
  20. float VoltValue_Samp0 = 0;//µçλÆ÷ʵ¼Êµçѹֵ
  21. unsigned int VoltValue_Display=0.0;

  22. #define uchar unsigned char
  23. #define uint unsigned int


  24. #define CS_0           GPIO_ResetBits (GPIO0, GPIO_Pin_6)
  25. #define CS_1           GPIO_SetBits(GPIO0, GPIO_Pin_6)
  26. #define WR_0           GPIO_ResetBits(GPIO0, GPIO_Pin_5)
  27. #define WR_1           GPIO_SetBits(GPIO0, GPIO_Pin_5)
  28. #define DA_0           GPIO_ResetBits(GPIO0, GPIO_Pin_4)
  29. #define DA_1           GPIO_SetBits(GPIO0, GPIO_Pin_4)

  30. uchar tmp;
  31. uchar n1, n2, n3, n4;
  32. unsigned char Ht1621Tab[]={0x00,0x00,0x00,0x00};
  33. //unsigned char DispTab[]={0x7B,0x12,0x67,0x57,0x1E,0x5D,0x7D,0x13,0x7F,0x5F,0x69,0x45,0x3f, 0x7a, 0x3e};
  34.               //          0    1    2    3    4    5    6    7    8    9    C    ?   A     V     H
  35. unsigned char DispTab[]={0x7B,0x12,0x67,0x57,0x1E,0x5D,0x7D,0x13,0x7F,0x5F,0x3F,0x7C,0x69,0x76,0x6D, 0x2D};
  36.               //          0    1    2    3    4    5    6    7    8    9    A    b   C     d     E      F

  37. #define  BIAS     0x52             //0b1000 0101 0010  1/3duty 4com
  38. #define  SYSDIS   0X00             //0b1000 0000 0000  ???????LCD?????
  39. #define  SYSEN    0X02             //0b1000 0000 0010 ???????
  40. #define  LCDOFF   0X04             //0b1000 0000 0100  ?LCD??
  41. #define  LCDON    0X06             //0b1000 0000 0110  ??LCD??
  42. #define  XTAL     0x28             //0b1000 0010 1000 ?????
  43. #define  RC256    0X30             //0b1000 0011 0000  ????
  44. #define  WDTDIS1  0X0A            //0b1000 0000 1010  ?????

  45. void Ht1621_CS_0() { CS_0;}  // define P2.2 ---> CS
  46. void Ht1621_CS_1() { CS_1;}

  47. void Ht1621_WR_0() { WR_0;}  // define P2.1 ---> WR
  48. void Ht1621_WR_1() { WR_1;}

  49. void Ht1621_DO_0() { DA_0;}  // define P2.0 ---> DAT
  50. void Ht1621_DO_1() { DA_1;}



  51. unsigned int counter;
  52. void BSP_Configuration(void);
  53. //-----------------------------------------------------------------------------------------
  54. //????:Delay()
  55. //?    ?:?????
  56. //-----------------------------------------------------------------------------------------
  57. void Delay(unsigned char us)  //5,7,9
  58. {
  59.   while(--us);
  60. }

  61. //-----------------------------------------------------------------------------------------
  62. //????:Delayms()
  63. //-----------------------------------------------------------------------------------------
  64. void Delayms(unsigned int ims)
  65. {
  66.   unsigned int i,j;
  67.     for(i=0;i<ims;i++)
  68.       for(j=0;j<65;j++) { Delay(1); }
  69. }

  70. //-----------------------------------------------------------------------------------------
  71. //Ht1621Wr_Data()
  72. //-----------------------------------------------------------------------------------------
  73. void Ht1621Wr_Data(unsigned char Data,unsigned char cnt)
  74. {
  75.   unsigned char i;
  76.   for (i=0;i<cnt;i++)
  77.    {
  78.      Ht1621_WR_0();
  79.      Delay(10);
  80.      if((Data & 0x80)==0x80) {Ht1621_DO_1();Delay(100);}
  81.      else {Ht1621_DO_0();Delay(100);}
  82.      Ht1621_WR_1();
  83.      Delay(10);
  84.      Data<<=1;
  85.    }
  86. }
  87. //-----------------------------------------------------------------------------------------
  88. //void Ht1621WrCmd(uchar Cmd)
  89. //-----------------------------------------------------------------------------------------
  90. void Ht1621WrCmd(unsigned char Cmd)
  91. {
  92.    Ht1621_CS_0();
  93.    Delay(10);
  94.    Ht1621Wr_Data(0x80,4);          //??????100
  95.    Ht1621Wr_Data(Cmd,8);           //??????
  96.    Ht1621_CS_1();
  97.    Delay(10);
  98. }
  99. //-----------------------------------------------------------------------------------------
  100. //void Ht1621WrOneData(uchar Addr,uchar Data)
  101. //-----------------------------------------------------------------------------------------
  102. void Ht1621WrOneData(unsigned char Addr,unsigned char Data)
  103. {
  104.   Ht1621_CS_0();
  105.   Ht1621Wr_Data(0xa0,3);  //??????101
  106.   Ht1621Wr_Data(Addr<<2,6); //??????
  107.   Ht1621Wr_Data(Data,4); //???????? 7  6  5  4
  108.   Ht1621_CS_1();
  109. }
  110. //-----------------------------------------------------------------------------------------
  111. //void Ht1621WrAllData()
  112. //-----------------------------------------------------------------------------------------
  113. void Ht1621WrAllData(unsigned char Addr,unsigned char *p,unsigned char cnt)
  114. {
  115.   unsigned char i;
  116.   Ht1621_CS_0();
  117.   Ht1621Wr_Data(0xa0,3); //??????101
  118.   Ht1621Wr_Data(Addr<<2,6); //??????
  119.   for (i=0;i<cnt;i++)
  120.    {
  121.     Ht1621Wr_Data(*p,8); //????
  122.     p++;
  123.    }
  124.   Ht1621_CS_1();
  125. }

  126. //-----------------------------------------------------------------------------------------
  127. //void Ht1621_Init(void)
  128. //-----------------------------------------------------------------------------------------
  129. void Ht1621_Init(void)
  130. {
  131.    Ht1621WrCmd(BIAS);
  132.    Ht1621WrCmd(RC256);             //???????
  133.    //Ht1621WrCmd(XTAL);             //???????
  134.    Ht1621WrCmd(SYSDIS);
  135.    Ht1621WrCmd(WDTDIS1);
  136.    Ht1621WrCmd(SYSEN);
  137.    Ht1621WrCmd(LCDON);
  138. }
  139. //-----------------------------------------------------------------------------------------
  140. //Display_lcd_dot
  141. //-----------------------------------------------------------------------------------------
  142. void Display_lcd_dot(void)
  143. {
  144.    Ht1621WrOneData(7 , 0x50);

  145. }
  146. //-----------------------------------------------------------------------------------------
  147. //DISPLAY
  148. //-----------------------------------------------------------------------------------------
  149. void Display(void)
  150. {
  151.    unsigned char com;
  152.    com = 0;
  153.    if((DispTab[n1]&0x01) == 0x01){ com = com + 0x10;}
  154.    if((DispTab[n2]&0x01) == 0x01){ com = com + 0x20;}
  155.    if((DispTab[n3]&0x01) == 0x01){ com = com + 0x40;}
  156.    if((DispTab[n4]&0x01) == 0x01){ com = com + 0x80;}
  157.    Ht1621WrOneData(0 , com);
  158.    com = 0;
  159.    if((DispTab[n1]&0x02) == 0x02){ com = com + 0x10;}
  160.    if((DispTab[n2]&0x02) == 0x02){ com = com + 0x20;}
  161.    if((DispTab[n3]&0x02) == 0x02){ com = com + 0x40;}
  162.    if((DispTab[n4]&0x02) == 0x02){ com = com + 0x80;}
  163.    Ht1621WrOneData(1 , com);
  164.          Display_lcd_dot();
  165.    com = 0;
  166.    if((DispTab[n1]&0x10) == 0x10){ com = com + 0x10;}
  167.    if((DispTab[n2]&0x10) == 0x10){ com = com + 0x20;}
  168.    if((DispTab[n3]&0x10) == 0x10){ com = com + 0x40;}
  169.    if((DispTab[n4]&0x10) == 0x10){ com = com + 0x80;}
  170.    Ht1621WrOneData(2 , com);
  171.    com = 0;
  172.    if((DispTab[n1]&0x40) == 0x40){ com = com + 0x10;}
  173.    if((DispTab[n2]&0x40) == 0x40){ com = com + 0x20;}
  174.    if((DispTab[n3]&0x40) == 0x40){ com = com + 0x40;}
  175.    if((DispTab[n4]&0x40) == 0x40){ com = com + 0x80;}
  176.    Ht1621WrOneData(3 , com);
  177.    com = 0;
  178.    if((DispTab[n1]&0x20) == 0x20){ com = com + 0x10;}
  179.    if((DispTab[n2]&0x20) == 0x20){ com = com + 0x20;}
  180.    if((DispTab[n3]&0x20) == 0x20){ com = com + 0x40;}
  181.    if((DispTab[n4]&0x20) == 0x20){ com = com + 0x80;}
  182.    Ht1621WrOneData(4 , com);
  183.    com = 0;
  184.    if((DispTab[n1]&0x08) == 0x08){ com = com + 0x10;}
  185.    if((DispTab[n2]&0x08) == 0x08){ com = com + 0x20;}
  186.    if((DispTab[n3]&0x08) == 0x08){ com = com + 0x40;}
  187.    if((DispTab[n4]&0x08) == 0x08){ com = com + 0x80;}
  188.    Ht1621WrOneData(5 , com);
  189.    com = 0;
  190.    if((DispTab[n1]&0x04) == 0x04){ com = com + 0x10;}
  191.    if((DispTab[n2]&0x04) == 0x04){ com = com + 0x20;}
  192.    if((DispTab[n3]&0x04) == 0x04){ com = com + 0x40;}
  193.    if((DispTab[n4]&0x04) == 0x04){ com = com + 0x80;}
  194.    Ht1621WrOneData(6 , com);
  195. }



  196. //-----------------------------------------------------------------------------------------
  197. //convertor()
  198. //-----------------------------------------------------------------------------------------

  199. void data_convertor(uchar adc_value)
  200. {
  201.     tmp=adc_value;         //adc

  202.     n4=0;

  203.     n3=tmp/100;

  204.     n2=tmp%100/10;
  205.                  // 4
  206.     n1=tmp%10;       //display "C"

  207. }

  208. int main(void)
  209. {
  210.         Hardware_init(); /* Ó²¼þ³õʼ»¯ */
  211.         Ht1621_Init();        //?????LCD
  212.         Delay(100);           //??????
  213.         Ht1621WrAllData(0,Ht1621Tab,16);// Clear LCD display
  214.         Ht1621_Init();
  215.         for (;;)
  216.         {
  217.                 ADCDataVolt_Samp0 = ADC_GetConversionValue(DAT0);/* »ñÈ¡µçλÆ÷²ÉÑùÊýÖµ */
  218.           VoltValue_Samp0 =  (ADCDataVolt_Samp0*3.6 ) / 0x7ff0 ;/* µçλÆ÷²ÉÑùת»¯ÎªÄ£ÄâÁ¿ */
  219.                 VoltValue_Display=(uchar)(VoltValue_Samp0*10000);
  220.                 data_convertor(VoltValue_Display);
  221.                 //data_convertor(235);
  222.     Display();
  223.                 delay_ms(1000); /*ÑÓʱ1s*/
  224.         }
  225. }

  226. /************************ (C) COPYRIGHT LINKO SEMICONDUCTOR **********************/
  227. /* ------------------------------END OF FILE------------------------------------ */
硬件初始化代码:
  1. void Hardware_init(void)
  2. {
  3.     __disable_irq();                  /* ¹Ø±ÕÖÐ¶Ï ÖжÏ×Ü¿ª¹Ø */
  4.     SYS_WR_PROTECT = 0x7a83;          /* ¿ªÆôдʹÄÜ*/
  5.     IWDG_DISABLE();                   /* ¹Ø±Õ¶ÀÁ¢¿´ÃŹ·Ê¹ÄÜ*/
  6.     FLASH_CFG |= 0x00080000;          /* FLASH Ԥȡ¼ÓËÙʹÄÜ*/
  7.    
  8.     delay_init(48);                   /* ÑÓʱº¯Êý³õʼ»¯Ê±ÖÓ48MHz*/
  9.     GPIO_init();                      /* GPIO³õʼ»¯ */
  10.     MCPWM_init();                     /* MCPWM_init ³õʼ»¯*/
  11.     ADC0_init();                      /* ADC0_init ³õʼ»¯ */
  12.           delay_us(100);                    /* ÑÓʱµÈ´ýÓ²¼þ³õʼ»¯Îȶ¨ */
  13.           __enable_irq();                   /* ¿ªÆô×ÜÖÐ¶Ï */
  14. }

  15. void GPIO_init(void)
  16. {
  17.     GPIO_InitTypeDef GPIO_InitStruct;
  18.     GPIO_StructInit(&GPIO_InitStruct);
  19.     /* P0.9 LED2*/
  20.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; /*Êä³öģʽ*/
  21.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_9;     /*Pin9*/
  22.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;  /*ÉÏÀ­¹¦ÄÜ*/
  23.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  24.                
  25.                 GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;    /*Êä³öģʽ*/
  26.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6;
  27.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_NOPULL; /*²»ÉÏÀ­*/
  28.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  29. }

  30. void ADC0_init(void)
  31. {
  32.     ADC_InitTypeDef ADC_InitStructure;
  33.        
  34.     ADC_StructInit(&ADC_InitStructure);              /*ADC³õʼ»¯½á¹¹Ìå*/
  35.     ADC_InitStructure.Align = ADC_LEFT_ALIGN;        /* ADCÊý¾ÝÊä³ö×ó¶ÔÆë*/
  36.     ADC_InitStructure.Trigger_Mode = ADC_1SEG_TRG;   /* ÉèÖÃADCת»»Ä£Ê½Îª4¶Îʽ²ÉÑù */
  37.     ADC_InitStructure.FirSeg_Ch = ADC_2_TIMES_SAMPLE;/* µÚÒ»¶Î¹²²ÉÑù2¸öͨµÀ */
  38.     ADC_InitStructure.SecSeg_Ch = 0;                 /* µÚ¶þ¶Î¹²²ÉÑù0¸öͨµÀ */
  39.     ADC_InitStructure.ThrSeg_Ch = 0;                 /* µÚÈý¶Î¹²²ÉÑù0¸öͨµÀ */
  40.     ADC_InitStructure.FouSeg_Ch = 0;                 /* µÚËĶι²²ÉÑù0¸öͨµÀ */
  41.     ADC_InitStructure.Trigger_Cnt = 0;               /* µ¥¶Î´¥·¢Ä£Ê½Ï´¥·¢Ò»´Î²ÉÑùËùÐèÒªµÄʼþÊý:
  42.                                                              0~15 0±íʾÐèÒªÒ»´Î´¥·¢£¬15±íʾÐèÒª16´Î*/
  43.     ADC_InitStructure.ADC_RANGE = ADC_RANGE_3V6;        /* ADCÁ¿³ÌÑ¡Ôñ*/  
  44.           ADC_InitStructure.Trigger_En = ADC_HARDWARE_T0_TRG; /* ¿ªÆôT0ºÍT1Ó²¼þ´¥·¢Ê¼þ */
  45.     ADC_InitStructure.SEL_En = ADC_MCPWM_SEL;           /* MCPWM´¥·¢ADC²ÉÑù */
  46.     ADC_InitStructure.ADC_SAMP_CLK = 20;                /* ÉèÖòÉÑùʱ¼äΪ20¸öADCʱÖÓÖÜÆÚ ·¶Î§4--35*/
  47.     ADC_InitStructure.IE = ADC_EOS0_IRQ_EN ;            /* ¿ªÆôµÚÒ»¶ÎÖÐ¶Ï */
  48.    
  49.           /* ADCÄ£Äâ¿´ÃŹ· */
  50.           ADC_InitStructure.ADC_GEN_En  = DISABLE ;          /* ¿´ÃŹ·¼à²â½ûÖ¹ */
  51.           ADC_InitStructure.ADC_GEN_HTH = 0;                 /* ADCÄ£Äâ¿´ÃŹ·ÉÏãÐÖµ */
  52.           ADC_InitStructure.ADC_GEN_LTH = 0;                 /* ADCÄ£Äâ¿´ÃŹ·ÏÂãÐÖµ */

  53.     ADC_InitStructure.REFOUT_EN = DISABLE;             /* ADC REFÊä³öʹÄÜ*/
  54.     ADC_Init(ADC, &ADC_InitStructure);
  55.    
  56.                 ADC_ChannelConfig(ADC,CHN0, ADC_CHANNEL_4 ,ADC_CHANNEL_4, ADC_CHANNEL_4 ,ADC_CHANNEL_4);
  57.                        
  58.     ADC_ClearIRQFlag(ADC, ADC_ALL_IRQ_IF) ;           /* ÇåÖжϱê־λ*/
  59. }

  60. void MCPWM_init(void)
  61. {
  62.     MCPWM_InitTypeDef MCPWM_InitStructure;
  63.     MCPWM_StructInit(&MCPWM_InitStructure);

  64.     MCPWM_InitStructure.CLK_DIV = 0;            /* MCPWMʱÖÓ·ÖÆµÉèÖà */
  65.     MCPWM_InitStructure.MCLK_EN = ENABLE;       /* Ä£¿éʱÖÓ¿ªÆô */
  66.     MCPWM_InitStructure.MCPWM_Cnt0_EN = ENABLE; /* ʱ»ù0Ö÷¼ÆÊýÆ÷¿ªÊ¼¼ÆÊýʹÄÜ¿ª¹Ø */
  67.    
  68.     /* ×Ô¶¯¸üÐÂʹÄܼĴæÆ÷ MCPWM_TH00 ×Ô¶¯¼ÓÔØÊ¹ÄÜ MCPWM_TMR0 ×Ô¶¯¼ÓÔØÊ¹ÄÜ MCPWM_0TH ×Ô¶¯¼ÓÔØÊ¹ÄÜ MCPWM_0CNT ×Ô¶¯¼ÓÔØÊ¹ÄÜ*/
  69.     MCPWM_InitStructure.AUEN = TMR0_AUEN | TMR1_AUEN | TMR2_AUEN | TMR3_AUEN;

  70.     MCPWM_InitStructure.TimeBase0_PERIOD = PWM_PERIOD;           /* ʱÆÚ0ÖÜÆÚÉèÖà */
  71.     MCPWM_InitStructure.TriggerPoint0 = (u16)( - (PWM_PERIOD>>2)); /* MCPWM_TMR0 ADC´¥·¢Ê¼þT0 ÉèÖà */
  72.     MCPWM_InitStructure.TriggerPoint1 = (u16)(-(PWM_PERIOD>>1));/* MCPWM_TMR1 ADC´¥·¢Ê¼þT1 ÉèÖà */
  73.     MCPWM_InitStructure.TriggerPoint2 = (u16)(PWM_PERIOD>>2); /* MCPWM_TMR0 ADC´¥·¢Ê¼þT0 ÉèÖà */
  74.     MCPWM_InitStructure.TriggerPoint3 = (u16)(PWM_PERIOD >> 1);/* MCPWM_TMR1 ADC´¥·¢Ê¼þT1 ÉèÖà */
  75.        
  76.           MCPWM_InitStructure.CNT0_T0_Update_INT_EN = ENABLE;           /* MCPWM T0ʼþ¸üÐÂʹÄÜ */
  77.        
  78.     MCPWM_Init(MCPWM0, &MCPWM_InitStructure);                    /* MCPWM0 Ä£¿é³õʼ»¯ */
  79. }
效果图:
3.jpg
2.11V.
4.jpg
2.28V.
5.jpg
1.58V.
6.jpg
1.75V.
7.jpg
1.93V.
8.jpg


便携手到老 发表于 2023-1-28 10:12 | 显示全部楼层
代码做的很规范,不错的好习惯。
麻花油条 发表于 2023-1-28 11:02 来自手机 | 显示全部楼层
哈哈,大过年的也在努力敲代码啊,太棒了

评论

确实该赞  发表于 2023-1-28 16:31
tpgf 发表于 2023-2-23 13:59 | 显示全部楼层
效果如何 感觉采集精度能达到要求吗
wakayi 发表于 2023-2-23 14:57 | 显示全部楼层
在飞线调试的阶段会不会因为连接不可靠导致ad采集不准呢
heimaojingzhang 发表于 2023-2-23 17:59 | 显示全部楼层
段式液晶屏就是计算器、电子表、数字万用表表等显示用的LCD屏吧
 楼主| 比神乐 发表于 2023-2-24 10:08 | 显示全部楼层
tpgf 发表于 2023-2-23 13:59
效果如何 感觉采集精度能达到要求吗

差不多吧
 楼主| 比神乐 发表于 2023-2-24 10:09 | 显示全部楼层
wakayi 发表于 2023-2-23 14:57
在飞线调试的阶段会不会因为连接不可靠导致ad采集不准呢

不可靠有可能采集不准,那就尽量让它可靠好啦
 楼主| 比神乐 发表于 2023-2-24 10:09 | 显示全部楼层
heimaojingzhang 发表于 2023-2-23 17:59
段式液晶屏就是计算器、电子表、数字万用表表等显示用的LCD屏吧

是的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

470

主题

3537

帖子

7

粉丝
快速回复 在线客服 返回列表 返回顶部