STM32
直播中

王兰

13年用户 877经验值
擅长:基础元器件
私信 关注
[问答]

基于STM32F103C8输入输入实验目的是什么

如何结合一个基于STM32+CUBEMX+CUBEMX读取温度计输出的工具的PWM实验工具呢?

回帖(1)

夏焕丽

2021-11-5 10:13:32
  基于STM32F103C8输入输入实验目的
  该项目是在训练时做的一个基于STM32+CUBEMX工具读取温度计输出的PWM波的实验,使用到了定时器读取输入任务和UART输出到串口,最终实现实现数据到的输出。
  使用的工具与设备
  1.STM32F103C8芯片
  2.ST-LINK下载器-用于烧写下载
  3.USB串口烧录器-用于串口输出信号到PC
  4.(测试)信号反应
  5.温度计(输出) PWM方波)
  实现流程与原理
  0}#mermaid-svg-rvRp2VUBw4Gf5BAc .edge-pattern-dashed{stroke-dasharray:3}#mermaid-svg-rvRp2VUBw4Gf5BAc .edge-pattern-dotted{stroke-dasharray:2}#mermaid-svg-rvRp2VUBw4Gfmark5 :#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana, arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { color rgba(0, 0, 0, 0.75); 字体:} 定时器 2}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker{fill:#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { 颜色:rgba(0, 0, 0, 0.75); 字体:} 定时器 2}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker{fill:#333}#mermaid-svg-rvRp2VUBw4Gf5BAc .marker.cross{stroke:#333} :root { --mermaid-font-family: “trebuchet ms”, verdana arial;} #mermaid-svg-rvRp2VUBw4Gf5BAc { 颜色:rgba(0, 0, 0, 0.75); 字体:} 定时器
  硬件
  捕获
  UART
  输出占空比
  使用UART输出到串口监视器:1.CUBE打开UART引脚2.修改的printf函数的输出PWM输入捕获:1.CUBE打开添计时器2.根据捕获原理编写代码3.溢出、功能中断处理 4.通过printf函数输出功能输出值 功能
  链接:原理原理
  CUBE部分
  
  点击ACCESS TO MCU SELECTOR选择芯片
  
  打开CUBE,搜索并选择芯片STM32F103C8
  
  选择System Core-》SYS-》Debug-》Serial Wire 打开串口线
  
  选择System Core-》RCC-》High Speed Check-》Crystal/Ceramic Resonator 外部晶振
  
  选择定时器-TIM2(行)-》时钟源-》内部时钟(内部时钟)
  选择Channel1-》输入捕捉直接模式(输入模式)
  打开中断TIM2全局中断
  PS:注意右上方A0位置绿色同时TIM2_CHI为一键一打开
  
  选择Connectivity-》USART1-》Mode-》Asynchronous(异步通信)
  中断看需求选择
  
  在Clock ConfigurationClock Configuration选择HCLK为72MHz
  ps:这里HCLK如果为64MHz或者不到最大可能是因为没有把之前的Crystal/Ceramic Resonator 外部晶振打开
  
  在项目经理中填写项目名称 保存位置 选择IDE以及版本
  
  在代码生成器或选中
  最后一个生成代码 GENERATE CODE
  Keil代码部分
  串口输出
  =
  在mian.c中找到并添加
  
  方法一、
  /* USER CODE BEGIN Includes */
  #include 《stdio.h》
  #ifdef __GNUC__
  /* With GCC, small printf (option LD Linker-》Libraries-》Small printf set to ‘Yes’) calls __io_putchar() * /
  #define PUTCHAR_PROTOTYPE int __io_putchar(int ch)
  #else #define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)
  #endif
  /* __GNUC__ */ PUTCHAR_PROTOTYPE
  {
  HAL_UART_Transmit(&huart1, (uint8_t *)&ch, 1, 0xFF 返回 ch;
  }
  /* USER CODE END Includes */
  方法二、
  /* USER CODE BEGIN Includes */
  #include 《string.h》
  #include 《stdio.h》
  uint8_t u_buf[64];
  //定义的数组,保存数据
  #define printf(。..)
  HAL_UART_Transmit(UART_HandleTypeDef *)&huart1, (uint8_t *)u_buf,sprintf((char*)u_buf,__VA_ARGS__), 0xFFFF);
  /* 用户代码结束包括 */
  有些代码的目的是生成printf函数的输入
  输入输入
  =
  
  /* USER CODE BEGIN 0 */ int8_t TIM2CH1_CAPTURE_UP_STA=0; //输入高饱和状态 作识别使用 低六位作为消费判断 如:0x111111(3F) int_t TIM2CH1_CAPTURE_DOWNSTA=0; //输入高饱和状态作识别使用低六位作为消费判断 int16_t TIM2CH1_CAPTURE_UP_VAL;//输入高数据数据值T21_CAPTURE_VAL//输入低值值DOWN /* USERCH END * 0/
  部分有高低血糖参数
  作为价值和状态位四个参数4_CAPTURE_DOWN_STA例子
  如上表所示TIM2CH1_CAPTURE_DOWN_STA的值为0xFF
  这里的6、7
  位为高位表达表达当前状态例如第7位为1 则TIM2CH1_CAPTURE_DOWN_STA = 0x80
  第6位为1则TIM2CH1_CAPTURE_DOWN_STA = 0x400-5
  位为低六位而0-5位为低六位
  知识繁殖这个最大的次数为0x3F会在代码里秘籍
  在主程序头添加代码
  /* USERCODE BEGIN 2 */
  HAL_TIM_IC_Start_IT(&htim2,TIM_CHANNEL_1);
  //启动启动__HAL_TIM_ENABLE_(&htim2, TIM_IT_UPDATE);
  //使能停止更新int16_t up=0;
  //高数据下宽=0;
  //周期doublety_Cycle//高宽比与生命周期的占空比
  /*USERCODE END 2/
  while循环内添加以下功能
  /* 用户代码开始时 */ while (1)
  {
  HAL_Delay(1);
  if(TIM2CH1_CAPTURE_UP_STA&X80)/
  /成功到了一次高数据
  {
  up=TIM2CH1_CAPTURE_UP_STA&0X3F;
  上*=65535;
  //注意力时间总和向上+=TIM2CH1_CAPTURE_UP_VAL;
  //得到总的高盐时间 up/=0.9845;
  //高盐时间值TIM2CH1_CAPTURE_UP_STA=0;
  //清空输入高负载状态
  }
  if(TIM2CH1CAPTURE_DOWN_STA0&X80)//成功输入了一次低数据
  {
  down=TIM2CH1_CAPTURE_DOWNSTA&0X3F;
  向下*=65535;
  //时间总和和down+=TIM2CH1_CAPTURE_DOWN_VAL;
  //得到总的低盐时间下降/= 0.99225;
  //周期偏差值TIM2CH1_CAPTURE_DOWNSTA=0;
  //清空输入低血压状态
  }
  printf(“up = %dtn”,);
  printf(“down = %dtn”,down);
  Duty_Cycle = (double)up /(double)down;
  //由于原因不需格式转换 if(Duty_Cycle != 0)
  {
  printf(“占空比:%.4lf °Crn”,((double)上/(双)下))
  ;
  }
  HAL_Delay(500);
  }
  /* 用户代码结束 */
  溢出中断函数↓
  捕获中断函数↓
  输出与验证
  使用信号信号发生占空比为0.5的方波
  连接PA0(TIM2),另一端接信号的红线
  信号电位黑线
  接地USB接口连接STM32的P9(TX)P10(RX)端
  信号自然数值设定为4KHz 高3.3V占空比为55%
  成功输出占空例如下图所示
  PS:我们已知设定的频率为4KHz,频率为72MHz 4KHz,占0.5
  那么高空时间比值为:72x06/4x103x0.5 =9x103 Hz
  与实际输出值相同
  
举报

更多回帖

发帖
×
20
完善资料,
赚取积分