[LKS32 软件] 【凌鸥创芯电机开发板LKS32MC071CBT8评测报告】4.外设测试

[复制链接]
 楼主| yuyy1989 发表于 2023-6-20 19:00 | 显示全部楼层 |阅读模式
<
本帖最后由 yuyy1989 于 2023-6-23 10:57 编辑

#申请原创#
4.外设测试
4.1 按键
功率底板上的2个按键都做了上拉处理,低电平触发
QQ截图20230619164404.png
这里写个简单的程序来测试一下这两个按键,按下START按键LED1亮松开熄灭,按下STOP按键LED2亮松开熄灭
查看MCU板的原理图,看看按键接到了哪个IO上
QQ截图20230620185600.png
代码示例,省略了LED的部分,相关代码可以从新建工程那个帖子找到
  1. #define KEY_GPIO GPIO2
  2. #define KEY1_PIN GPIO_Pin_11
  3. #define KEY2_PIN GPIO_Pin_12
  4. #define KEY_PINS KEY1_PIN|KEY2_PIN

  5. void key_init()
  6. {
  7.     GPIO_InitTypeDef GPIO_InitStruct;
  8.     GPIO_StructInit(&GPIO_InitStruct);

  9.     GPIO_StructInit(&GPIO_InitStruct);
  10.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  11.     GPIO_InitStruct.GPIO_Pin =  KEY_PINS;
  12.     GPIO_Init(KEY_GPIO, &GPIO_InitStruct);
  13. }

  14. void mcu_init(void)
  15. {
  16.     __disable_irq();         /* 关闭中断 中断总开关 */
  17.     SYS_WR_PROTECT = 0x7a83; /*使能系统寄存器写操作*/
  18.     FLASH_CFG |= 0x00080000; /* enable prefetch ,FLASH预取加速使能*/        
  19.     IWDG_DISABLE();                                                /*关闭清零看门狗*/
  20.     SYS_MclkChoice(SYS_MCLK_96M_RC); /*选择当前主时钟频率*/
  21.     SysClock = SYS_ReadMcuClk();
  22.     led_init();        
  23.     key_init();
  24.     yuyy_delay_us(100);          /* 延时等待硬件初始化稳定 */
  25.     SYS_WR_PROTECT = 0x0;    /*关闭系统寄存器写操作*/
  26.     __enable_irq();          /* 开启总中断 */
  27. }

  28. int main(void)
  29. {
  30.     mcu_init();
  31.         while (1)
  32.         {
  33.         if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY1_PIN))
  34.             GPIO_SetBits(LED_GPIO, LED1_PIN);
  35.         else
  36.             GPIO_ResetBits(LED_GPIO, LED1_PIN);
  37.         
  38.         if(Bit_RESET == GPIO_ReadInputDataBit(KEY_GPIO,KEY2_PIN))
  39.             GPIO_SetBits(LED_GPIO, LED2_PIN);
  40.         else
  41.             GPIO_ResetBits(LED_GPIO, LED2_PIN);
  42.         }
  43. }
运行效果
eba9bc4fba001650f560eaed1f7663f3 00_00_00-00_00_30.gif
4.2 PWM输出
通过使用Timer的比较模式可以输出PWM,查看原理图,LED1和LED2的引脚正好是Timer1两个通道的输出,用这两个LED写个呼吸灯测试一下PWM输出功能
QQ截图20230620161049.png
工程需添加库文件lks32mc07x_tim.c
QQ截图20230620202934.png
代码示例
  1. void pwm_gpio_init()
  2. {
  3.     GPIO_InitTypeDef GPIO_InitStruct;
  4.     GPIO_StructInit(&GPIO_InitStruct); //初始化结构体

  5.     //配置P0.6 UTIMER1_CH0  配置P0.7 UTIMER1_CH1
  6.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //GPIO输出模式
  7.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7;
  8.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  9.     GPIO_PinAFConfig(GPIO0,GPIO_PinSource_6,AF7_TIMER01); //P0.6复用为timer1的输出模式
  10.     GPIO_PinAFConfig(GPIO0,GPIO_PinSource_7,AF7_TIMER01); //P0.7复用为timer1的输出模式
  11. }

  12. void pwm_utimer_init(void)
  13. {
  14.     TIM_TimerInitTypeDef TIM_InitStruct;

  15.     TIM_TimerStrutInit(&TIM_InitStruct);                    /* Timer结构体初始化*/
  16.     TIM_InitStruct.Timer_CH0_WorkMode = TIMER_OPMode_CMP;   /* 设置Timer CH0 为比较模式 */
  17.     TIM_InitStruct.Timer_CH0Output = 0;                     /* 计数器回零时,比较模式输出极性控制 */
  18.     TIM_InitStruct.Timer_CH1_WorkMode = TIMER_OPMode_CMP;   /* 设置Timer CH1 为比较模式 */
  19.     TIM_InitStruct.Timer_CH1Output = 0;                     /* 计数器回零时,比较模式输出极性控制 */
  20.     TIM_InitStruct.Timer_TH = 6000;                         /* 定时器计数门限初始值6000*/
  21.     TIM_InitStruct.Timer_CMP0 = 0;                          /* 设置比较模式的CH0比较初始值0 */
  22.     TIM_InitStruct.Timer_CMP1 = 0;                          /* 设置比较模式的CH1比较初始值0 */
  23.     TIM_InitStruct.Timer_FLT = 0;                           /* 设置捕捉模式或编码器模式下对应通道的数字滤波值 */
  24.     TIM_InitStruct.Timer_ClockDiv = TIMER_CLK_DIV16;        /* 设置Timer模块时钟分频系数 */
  25.     TIM_TimerInit(UTIMER1, &TIM_InitStruct);
  26.     TIM_TimerCmd(UTIMER1, ENABLE);                          /* Timer1 模块使能 */        
  27. }

  28. void mcu_init(void)
  29. {
  30.     __disable_irq();         /* 关闭中断 中断总开关 */
  31.     SYS_WR_PROTECT = 0x7a83; /*使能系统寄存器写操作*/
  32.     FLASH_CFG |= 0x00080000; /* enable prefetch ,FLASH预取加速使能*/        
  33.     IWDG_DISABLE();                                                /*关闭清零看门狗*/
  34.     SYS_MclkChoice(SYS_MCLK_96M_RC); /*选择当前主时钟频率*/
  35.     SysClock = SYS_ReadMcuClk();
  36.     pwm_gpio_init();
  37.     pwm_utimer_init();
  38.     yuyy_delay_us(100);          /* 延时等待硬件初始化稳定 */
  39.     SYS_WR_PROTECT = 0x0;    /*关闭系统寄存器写操作*/
  40.     __enable_irq();          /* 开启总中断 */
  41. }

  42. int main(void)
  43. {
  44.     uint16_t pwm = 0;
  45.     uint8_t dir = 0;
  46.     mcu_init();
  47.         while (1)
  48.         {
  49.         if(dir == 0)
  50.         {
  51.             pwm++;
  52.             if(pwm == 6000)
  53.                 dir = 1;
  54.         }
  55.         else
  56.         {
  57.             pwm--;
  58.             if(pwm == 0)
  59.                 dir = 0;
  60.         }
  61.         TIM_CMP0(UTIMER1,pwm);
  62.         TIM_CMP1(UTIMER1,6000-pwm);
  63.         yuyy_delay_us(200);
  64.         }
  65. }
运行效果
WeChat_20230620162104 00_00_00-00_00_30.gif
4.3 SPI驱动LCD屏幕
LKS32MC071有一路 SPI,支持主从模式,手里有个12864的LCD屏幕可以用SPI驱动
驱动这个屏幕需要用到5个IO CS RST A0 SCK MOSI,在原理图上尽量找没有被用到的IO
P0.14作为SPI_SCK P2.10作为SPI_MOSI P2.3作为CS P2.2作为RST P3.2作为A0
QQ截图20230621110753.png
工程需添加库文件lks32mc07x_spi.c
QQ截图20230620203018.png
代码示例,只列出了适配部分的代码
  1. #include "yuyy_hs12864g18b_spi.h"
  2. #include "yuyy_delay.h"
  3. #include "lks32mc07x_gpio.h"
  4. #if(!YUYY_HS12864G18B_USE_SOFT_SPI)
  5. #include "lks32mc07x_spi.h"
  6. #endif
  7. //spi1 mosi P2.10
  8. //spi1 clk P0.14
  9. //CSPIN    P2.3
  10. //RSTPIN    P2.2
  11. //A0PIN     P3.2
  12. #define HS12864G18B_SPI_MOSI(x)   x==YUYY_GPIO_LEV0?GPIO_ResetBits(GPIO2,GPIO_Pin_10):GPIO_SetBits(GPIO2,GPIO_Pin_10)
  13. #define HS12864G18B_SPI_SCK(x)    x==YUYY_GPIO_LEV0?GPIO_ResetBits(GPIO0,GPIO_Pin_14):GPIO_SetBits(GPIO0,GPIO_Pin_14)
  14. #define HS12864G18B_SPI_CS(x)     x==YUYY_GPIO_LEV0?GPIO_ResetBits(GPIO2,GPIO_Pin_3):GPIO_SetBits(GPIO2,GPIO_Pin_3)
  15. #define HS12864G18B_SPI_RST(x)    x==YUYY_GPIO_LEV0?GPIO_ResetBits(GPIO2,GPIO_Pin_2):GPIO_SetBits(GPIO2,GPIO_Pin_2)
  16. #define HS12864G18B_SPI_A0(x)     x==YUYY_GPIO_LEV0?GPIO_ResetBits(GPIO3,GPIO_Pin_2):GPIO_SetBits(GPIO3,GPIO_Pin_2)

  17. void yuyy_hs12864g18b_spi_delayus(uint16_t us)
  18. {
  19.         yuyy_delay_us(us);
  20. }

  21. void yuyy_hs12864g18b_spi_init(void)
  22. {
  23.     GPIO_InitTypeDef GPIO_InitStruct;
  24.     GPIO_StructInit(&GPIO_InitStruct);

  25.     GPIO_InitStruct.GPIO_PuPd = GPIO_PuPd_UP;
  26.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT; //设置为输出模式
  27.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2 | GPIO_Pin_3 | GPIO_Pin_10;
  28.     GPIO_Init(GPIO2, &GPIO_InitStruct);

  29.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_2;
  30.     GPIO_Init(GPIO3, &GPIO_InitStruct);

  31.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_14;
  32.     GPIO_Init(GPIO0, &GPIO_InitStruct);
  33.         #if(YUYY_HS12864G18B_USE_SOFT_SPI)
  34.     #else
  35.     SPI_InitTypeDef SPI_InitStruct;
  36.     GPIO_PinAFConfig(GPIO0, GPIO_PinSource_14, AF5_SPI); //GPIO0.14复用SPI_CLK功能
  37.     GPIO_PinAFConfig(GPIO2, GPIO_PinSource_10, AF5_SPI); //GPIO2.10复用SPI_DO功能

  38.     SPI_StructInit(&SPI_InitStruct);              // SPI结构体初始化
  39.     SPI_InitStruct.Duplex = SPI_Full;             //双工模式设置
  40.     SPI_InitStruct.Mode = SPI_Master;             //master主机模式
  41.     SPI_InitStruct.EN = ENABLE;                   //使能SPI模块
  42.     SPI_InitStruct.TRANS_MODE = SPI_DMA_DISABLE;  // 选择SPI搬移方式,由MCU搬运数据到SPI
  43.     SPI_InitStruct.Trig = 0;                      //内部自动触发传输
  44.     SPI_InitStruct.ENDIAN = SPI_FIRSTSEND_MSB;   //该字节先发送 MSB
  45.     SPI_InitStruct.CPHA = 1;                      //第2个沿为发送数据时刻
  46.     SPI_InitStruct.CPOL = 1;                      //CLK默认高电平
  47.     SPI_InitStruct.BaudRate = 11;                 //传输速度96MHZ/(2*(11+1))= 4MHZ
  48.     SPI_InitStruct.ByteLength = 8;                //发送零个字节
  49.     SPI_InitStruct.IRQEna = DISABLE;              //关闭SPI各中断
  50.     SPI_Init(SPI0, &SPI_InitStruct);               //SPI初始化程序
  51.     #endif
  52.     HS12864G18B_SPI_CS(YUYY_GPIO_LEV1);
  53. }

  54. void yuyy_hs12864g18b_spi_writebyte(uint8_t dat)
  55. {
  56.     #if(YUYY_HS12864G18B_USE_SOFT_SPI)
  57.     uint8_t i = 0;
  58.     while(i<8)
  59.     {
  60.         HS12864G18B_SPI_SCK(YUYY_GPIO_LEV0);
  61.         if(dat & 0x80)
  62.             HS12864G18B_SPI_MOSI(YUYY_GPIO_LEV1);
  63.         else
  64.             HS12864G18B_SPI_MOSI(YUYY_GPIO_LEV0);
  65.         HS12864G18B_SPI_SCK(YUYY_GPIO_LEV1);
  66.         dat <<= 1;
  67.         i++;
  68.     }
  69.     #else
  70.     SPI_SendData(SPI0,dat);
  71.     #endif
  72. }

  73. void yuyy_hs12864g18b_spi_cs(YUYY_GPIO_LEV_TYPE lev)
  74. {
  75.     yuyy_hs12864g18b_spi_delayus(5);
  76.     HS12864G18B_SPI_CS(lev);
  77.     yuyy_hs12864g18b_spi_delayus(5);
  78. }
  79. void yuyy_hs12864g18b_spi_rst(YUYY_GPIO_LEV_TYPE lev)
  80. {
  81.     HS12864G18B_SPI_RST(lev);
  82. }
  83. void yuyy_hs12864g18b_spi_a0(YUYY_GPIO_LEV_TYPE lev)
  84. {
  85.     HS12864G18B_SPI_A0(lev);
  86. }

  87. void mcu_init(void)
  88. {
  89.     __disable_irq();         /* 关闭中断 中断总开关 */
  90.     SYS_WR_PROTECT = 0x7a83; /*使能系统寄存器写操作*/
  91.     FLASH_CFG |= 0x00080000; /* enable prefetch ,FLASH预取加速使能*/        
  92.     IWDG_DISABLE();                                                /*关闭清零看门狗*/
  93.     SYS_MclkChoice(SYS_MCLK_96M_RC); /*选择当前主时钟频率*/
  94.     SysClock = SYS_ReadMcuClk();
  95.     yuyy_hs12864g18b_init();
  96.     yuyy_delay_us(100);          /* 延时等待硬件初始化稳定 */
  97.     SYS_WR_PROTECT = 0x0;    /*关闭系统寄存器写操作*/
  98.     __enable_irq();          /* 开启总中断 */
  99. }

  100. int main(void)
  101. {
  102.     mcu_init();
  103.     yuyy_hs12864g18b_clear_screen();
  104.     yuyy_hs12864g18b_display_string_8x16(0,0,0,(uint8_t *)"LKS32MC071 SPI");
  105.     yuyy_hs12864g18b_display_string_8x16(0,2,0,(uint8_t *)"12864LCD TEST");
  106.     yuyy_hs12864g18b_display_string_8x16(0,4,0,(uint8_t *)"Code by yuyy1989");
  107.     yuyy_hs12864g18b_display_finish();
  108.         while (1)
  109.         {
  110.         }
  111. }
运行效果
微信图片_20230620173630.jpg

4.4 UART串口通讯
LKS32MC071有2路UART,功率底板上引出的是UART0,做一个简单的通讯测试,将串口发送过来的字母数字显示在LCD屏幕上
工程需添加库文件lks32mc07x_uart.c
QQ截图20230621202222.png
初始化的时候发现初始化UART的结构体中断位是8位的,空闲中断是bit8,也就是没办法通过初始化UART的结构体设置空闲中断
QQ截图20230623093132.png
代码示例
  1. #define UART_BUFF_LEN 16
  2. uint8_t uart_buff[17];
  3. uint8_t uart_rxlen = 0;

  4. void uart_init()
  5. {
  6.     GPIO_InitTypeDef GPIO_InitStruct;
  7.     GPIO_StructInit(&GPIO_InitStruct);
  8.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_IN;
  9.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_15;
  10.     GPIO_Init(GPIO0, &GPIO_InitStruct);

  11.     GPIO_InitStruct.GPIO_Mode = GPIO_Mode_OUT;
  12.     GPIO_InitStruct.GPIO_Pin = GPIO_Pin_0;
  13.     GPIO_Init(GPIO1, &GPIO_InitStruct);
  14.    
  15.     GPIO_PinAFConfig(GPIO0, GPIO_PinSource_15, AF4_UART); //P0.15复用为UART_RX
  16.     GPIO_PinAFConfig(GPIO1, GPIO_PinSource_0, AF4_UART); //P1.0复用为UART_TX
  17.    
  18.     UART_InitTypeDef UART_InitStruct;
  19.    
  20.     UART_StructInit(&UART_InitStruct);
  21.     UART_InitStruct.BaudRate = 115200;                 /* 设置波特率115200 */
  22.     UART_InitStruct.WordLength = UART_WORDLENGTH_8b;  /* 发送数据长度8位 */
  23.     UART_InitStruct.StopBits = UART_STOPBITS_1b;        /* 停止位1位 */
  24.     UART_InitStruct.FirstSend = UART_FIRSTSEND_LSB;   /* 先发送LSB */
  25.     UART_InitStruct.ParityMode = UART_Parity_NO;      /* 无奇偶校验 */
  26.     //UART_InitStruct.IRQEna = UART_IRQEna_RcvOver|UART_IRQEna_IDLE; /* 空闲中断还不能这么设置 */
  27.     UART_Init(UART0, &UART_InitStruct);
  28.     UART0->IE = UART_IRQEna_RcvOver|UART_IRQEna_IDLE;//接收中断和空闲中断
  29.    
  30.     NVIC_EnableIRQ(UART0_IRQn);        /* 使能UART_IRQn外部中断*/
  31.     NVIC_SetPriority(UART0_IRQn, 0);   /* UART_IRQn外部中断优先级设置为0*/
  32. }

  33. void UART0_IRQHandler(void)
  34. {
  35.     if (UART_GetIRQFlag(UART0, UART_IF_RcvOver))     // 接收完成中断
  36.     {
  37.         UART_ClearIRQFlag(UART0, UART_IF_RcvOver);         // 清除接收完成标志位
  38.         uart_buff[uart_rxlen] = UART_ReadData(UART0); // 接收 1 Byte数据
  39.         uart_rxlen++;
  40.     }
  41.     if (UART_GetIRQFlag(UART0, UART_IF_IDLE) || uart_rxlen == UART_BUFF_LEN)    // 空闲中断
  42.     {
  43.         UART_ClearIRQFlag(UART0, UART_IF_IDLE);  // 清除空闲标志位
  44.         while(uart_rxlen < UART_BUFF_LEN)
  45.         {
  46.             uart_buff[uart_rxlen] = ' ';
  47.             uart_rxlen++;
  48.         }   
  49.         uart_buff[UART_BUFF_LEN] = '\0';
  50.         yuyy_hs12864g18b_display_string_8x16(0,6,0,uart_buff);
  51.         yuyy_hs12864g18b_display_finish();
  52.         uart_rxlen = 0;
  53.     }
  54. }

  55. void mcu_init(void)
  56. {
  57.     __disable_irq();         /* 关闭中断 中断总开关 */
  58.     SYS_WR_PROTECT = 0x7a83; /*使能系统寄存器写操作*/
  59.     FLASH_CFG |= 0x00080000; /* enable prefetch ,FLASH预取加速使能*/        
  60.     IWDG_DISABLE();                                                /*关闭清零看门狗*/
  61.     SYS_MclkChoice(SYS_MCLK_96M_RC); /*选择当前主时钟频率*/
  62.     yuyy_hs12864g18b_init();
  63.     uart_init();
  64.     yuyy_delay_us(100);          /* 延时等待硬件初始化稳定 */
  65.     SYS_WR_PROTECT = 0x0;    /*关闭系统寄存器写操作*/
  66.     __enable_irq();          /* 开启总中断 */
  67. }

  68. int main(void)
  69. {
  70.     mcu_init();
  71.     yuyy_hs12864g18b_clear_screen();
  72.     yuyy_hs12864g18b_display_string_8x16(0,0,0,(uint8_t *)"LKS32MC071 SPI");
  73.     yuyy_hs12864g18b_display_string_8x16(0,2,0,(uint8_t *)"12864LCD TEST");
  74.     yuyy_hs12864g18b_display_string_8x16(0,4,0,(uint8_t *)"Code by yuyy1989");
  75.     yuyy_hs12864g18b_display_finish();
  76.     while (1)
  77.     {
  78.     }
  79. }
运行效果
WeChat_20230621211729 00_00_00-00_00_30~1.gif
4.5 ADC电位器
底板上有个可调电位器,用它来测试一下ADC功能,将电位器调节后的电压用串口和LCD屏显示出来
工程需添加库文件lks32mc07x_adc.c和lks32mc07x_nvr.lib
QQ截图20230622172510.png
代码示例
  1. void adc_init()
  2. {
  3.     ADC_InitTypeDef ADC_InitStructure;
  4.    
  5.     ADC_StructInit(&ADC_InitStructure);
  6.     //ADC_InitStructure.IE         = ADC_SF1_IE | ADC_SF2_IE;          // 中断使能
  7.     ADC_InitStructure.RE         = 0;                   // DMA请求使能
  8.     ADC_InitStructure.NSMP       = DISABLE;              // 两段采样使能
  9.     ADC_InitStructure.DATA_ALIGN = DISABLE;             // 禁用DAT右对齐使能
  10.     ADC_InitStructure.CSMP       = DISABLE;             // 连续采样使能
  11.     ADC_InitStructure.TCNT       = 1;                   // 触发一次采样所需的事件数
  12.     ADC_InitStructure.TROVS      = ENABLE;             // 手动触发过采样使能,开启后一次采样需要多次触发
  13.     ADC_InitStructure.OVSR       = 0;                   // 过采样率
  14.     ADC_InitStructure.S1         = 4;                   // 第一段常规采样次数
  15.     ADC_InitStructure.S2         = 0;                   // 第二段常规采样次数
  16.     ADC_InitStructure.IS1        = 0;                   // 空闲采样次数
  17.     ADC_InitStructure.LTH        = 0;                   // ADC 模拟看门狗 0 下阈值
  18.     ADC_InitStructure.HTH        = 0;                   // ADC 模拟看门狗 0 上阈值
  19.     ADC_InitStructure.GEN        = 0;                   // ADC 模拟看门狗 0 对应使能位
  20.     ADC_Init(ADC0, &ADC_InitStructure);
  21.     ADC_ClearIRQFlag(ADC0, ADC_ALL_IF);//清除所有中断标志位
  22.         
  23.     ADC_CHN_GAIN_CFG(ADC0,CHN0,ADC_CHANNEL_9,ADC_GAIN3V6);
  24.     ADC_CHN_GAIN_CFG(ADC0,CHN1,ADC_CHANNEL_9,ADC_GAIN3V6);
  25.     ADC_CHN_GAIN_CFG(ADC0,CHN2,ADC_CHANNEL_9,ADC_GAIN3V6);
  26.     ADC_CHN_GAIN_CFG(ADC0,CHN3,ADC_CHANNEL_9,ADC_GAIN3V6);
  27. }

  28. void mcu_init(void)
  29. {
  30.     __disable_irq();         /* 关闭中断 中断总开关 */
  31.     SYS_WR_PROTECT = 0x7a83; /*使能系统寄存器写操作*/
  32.     FLASH_CFG |= 0x00080000; /* enable prefetch ,FLASH预取加速使能*/        
  33.     IWDG_DISABLE();                                                /*关闭清零看门狗*/
  34.     SYS_MclkChoice(SYS_MCLK_96M_RC); /*选择当前主时钟频率*/
  35.     led_init();        
  36.     yuyy_hs12864g18b_init();
  37.     uart_init();
  38.     adc_init();
  39.     yuyy_delay_us(100);          /* 延时等待硬件初始化稳定 */
  40.     SYS_WR_PROTECT = 0x0;    /*关闭系统寄存器写操作*/
  41.     __enable_irq();          /* 开启总中断 */
  42. }

  43. int main(void)
  44. {
  45.     int32_t adcval = 0;
  46.     float vol = 0;
  47.     uint8_t lcdout[17] = {0};
  48.     mcu_init();
  49.     yuyy_hs12864g18b_clear_screen();
  50.     yuyy_hs12864g18b_display_string_8x16(0,0,0,(uint8_t *)"LKS32MC071 SPI");
  51.     yuyy_hs12864g18b_display_string_8x16(0,2,0,(uint8_t *)"12864LCD TEST");
  52.     yuyy_hs12864g18b_display_string_8x16(0,4,0,(uint8_t *)"Code by yuyy1989");
  53.     yuyy_hs12864g18b_display_finish();
  54.     while (1)
  55.     {
  56.         yuyy_delay_ms(500);
  57.         ADC_SoftTrgEN(ADC0,ENABLE);
  58.         //while(!ADC_GetIRQFlag(ADC0,ADC_SF1_IF));
  59.         adcval = ADC_GetConversionValue(ADC0,DAT0) + ADC_GetConversionValue(ADC0,DAT1) + ADC_GetConversionValue(ADC0,DAT2)+ADC_GetConversionValue(ADC0,DAT3);
  60.         adcval /= 64; //右移4位相当于/16,再取平均数/4
  61.         vol = (float)adcval/2047 *3.6 / 2 * 3; //反推ZB点电压值
  62.         printf("ADC %d %d %d %d\r\n",ADC_GetConversionValue(ADC0,DAT0),ADC_GetConversionValue(ADC0,DAT1),ADC_GetConversionValue(ADC0,DAT2),ADC_GetConversionValue(ADC0,DAT3));
  63.         printf("ADC vol %.2fv",vol);
  64.         sprintf((char *)lcdout,"ADC vol %.2fv",vol);
  65.         yuyy_hs12864g18b_display_string_8x16(0,6,0,lcdout);
  66.     }
  67. }
运行效果,我用daplink的5v输出对MCU板进行供电,用万用表实测电位器两端电源不到4.5v,ADC转换后的电压与用万用表测得电压相差0.02v左右
WeChat_20230622172402 00_00_00-00_00_30.gif QQ截图20230622171329.png


评论

很好的分享  发表于 2025-5-30 12:45
tpgf 发表于 2023-7-5 09:17 | 显示全部楼层
这种情况下是不是应该在软件上进行滤波呢
qcliu 发表于 2023-7-5 10:02 | 显示全部楼层
楼主在这个程序里边使用的是哪种采样方式啊
drer 发表于 2023-7-5 10:20 | 显示全部楼层
外部引脚的调试还是比较容易的 就是ad的精度不好弄
kxsi 发表于 2023-7-5 11:09 | 显示全部楼层
看了一下 这几个外设楼主用的就是顺序工作的方式吧
coshi 发表于 2023-7-5 18:00 | 显示全部楼层
串口通讯的最高速度能配置到多快呢
wiba 发表于 2023-7-5 18:41 | 显示全部楼层
传输间隔大概就是500毫秒一次了 出现过数据丢失的情况吗
caigang13 发表于 2023-7-7 08:07 来自手机 | 显示全部楼层
这个还带电机驱动板吧
 楼主| yuyy1989 发表于 2023-7-7 08:21 | 显示全部楼层
coshi 发表于 2023-7-5 18:00
串口通讯的最高速度能配置到多快呢

手册上的波特率范围是300~115200
 楼主| yuyy1989 发表于 2023-7-7 08:22 | 显示全部楼层
wiba 发表于 2023-7-5 18:41
传输间隔大概就是500毫秒一次了 出现过数据丢失的情况吗

没长时间测试过
 楼主| yuyy1989 发表于 2023-7-7 08:22 | 显示全部楼层
caigang13 发表于 2023-7-7 08:07
这个还带电机驱动板吧

对,下面的就是电机驱动板
封存into 发表于 2025-6-24 22:39 | 显示全部楼层
开发版真漂亮
您需要登录后才可以回帖 登录 | 注册

本版积分规则

认证:同飞软件研发工程师
简介:制冷系统单片机软件开发,使用PID控制温度

161

主题

815

帖子

10

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