OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 6411|回复: 15

PWM输入捕获的占空比可以在中断程序里送去LCD显示吗

[复制链接]

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
发表于 2022-7-21 16:17:35 | 显示全部楼层 |阅读模式
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-7-21 19:16:03 | 显示全部楼层
试一下不就知道了,不要懒。
专治疑难杂症
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-22 12:14:29 | 显示全部楼层
LcwSwust 发表于 2022-7-21 19:16
试一下不就知道了,不要懒。

新手,搞了好几天都不成
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-7-22 12:46:21 | 显示全部楼层
77chl 发表于 2022-7-22 12:14
新手,搞了好几天都不成

“不成”是啥现象,你得描述清楚。
再把相关程序弄上来。
专治疑难杂症
回复

使用道具 举报

7

主题

99

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
220
金钱
220
注册时间
2015-2-26
在线时间
35 小时
发表于 2022-7-22 13:57:31 | 显示全部楼层
输入捕获的中断 得到占空比 存款冲区,另外的中断或者循环   lcd显示缓冲区的占空比
汽车OBD

OBD 学习群 907183926
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-22 16:10:00 | 显示全部楼层
//STM32单片机控制LCD1602,在LCD1602的第一行显示测量值val

#include "stdio.h"
#include "stm32f10x_tim.h"
#include "stm32f10x.h"

void RCC_Configration(void);
void GPIO_Configration(void);
void NVIC_Configration(void);


u8 Table2[8]; //字符串数组全局变量定义
float PD;
float Freq;
float IC2_CCR1;
float IC2_CCR2;
       

void RCC_Configration(void)
{
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE);//打开TIM3时钟
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB|RCC_APB2Periph_GPIOC, ENABLE);//使能PA,PB,PC端口时钟
        }
       
void GPIO_Configration(void)
{
        GPIO_InitTypeDef GPIO_InitStructure;
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_7;        //设定TIM3的CH2对应引脚PA9为PWM捕获输入端
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);                //根据设定参数初始化GPIOA       
       
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2;                                 //LCD1602的三根控制线rs,rw,en
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;        //IO口速度为50MHz
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
  GPIO_Init(GPIOB, &GPIO_InitStructure);//根据设定参数初始化GPIOC                                         
   
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2|GPIO_Pin_3|GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7;//LCD1602的8跟数据线                           
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;//推挽输出
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;//IO口速度为50MHz
  GPIO_Init(GPIOC, &GPIO_InitStructure);//根据设定参数初始化GPIOB

}

void NVIC_Configration(void)
{
        NVIC_InitTypeDef NVIC_InitStructure;
        NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn;  //开启TIM1中断
        NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;  //先占优先级0级
        NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;  //从优先级0级
        NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道被使能
        NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器
}

       
                /*******************主函数************************/
int main(void)
{
  TIM_ICInitTypeDef  TIM_ICInitStructure;
       
          TIM_TimeBaseInitTypeDef  TIM_TimeBaseStructure;
       
        RCC_Configration( );
        NVIC_Configration( );
        GPIO_Configration( );
   
                       
        TIM_ICInitStructure.TIM_Channel = TIM_Channel_2;  //选择TIM3的通道2
  TIM_ICInitStructure.TIM_ICPolarity = TIM_ICPolarity_Rising;  //上升沿触发
  TIM_ICInitStructure.TIM_ICSelection = TIM_ICSelection_DirectTI;  //IC1直接连接TI2FP2
  TIM_ICInitStructure.TIM_ICPrescaler = TIM_ICPSC_DIV1;  //对输入的PWM信号不分频
  TIM_ICInitStructure.TIM_ICFilter = 0x0;

  TIM_PWMIConfig(TIM3, &TIM_ICInitStructure);
       
        TIM_SelectInputTrigger(TIM3, TIM_TS_TI2FP2);//选择输入捕获的触发信号;
        TIM_SelectSlaveMode(TIM3, TIM_SlaveMode_Reset);  // 选择从模式
        TIM_SelectMasterSlaveMode(TIM3, TIM_MasterSlaveMode_Enable); // PWM输入模式时,从模式必须工作在复位模式,当捕获开始时,计数器CNT被复位清零;
  
        TIM_Cmd(TIM3, ENABLE);// 计数器开始计数
       
  TIM_ITConfig(TIM3, TIM_IT_CC2, ENABLE);        // 开启2通道CC2中断,这个中断针对主捕获通道(TI2FP2)
       
       
        while(1)
                {
  u8 i,j;
        u8 table1[ ]="PD:" ;
   
        delay_init();//延时函数初始化
       
  LCD1602_Init();//LCD1602初始化函数
       
        sprintf(Table2,"%.2f",PD);//将浮点数PD转换为字符串函数,保留2位小数
       
        while(1)
  {
           LCD_Write_Command(0x80);//第一行的首地址
    for(i=0;i<3;i++)
    {
                        delay_ms(10);//延时很重要,否则第一个字符会丢掉
       LCD_Write_Date(table1[i]);
             delay_ms(5);
    }
    LCD_Write_Command(0x84);
    for(j=0;j<5;j++)
    {
                        delay_ms(5);
             LCD_Write_Date(Table2[j]);
             delay_ms(5);
                }
               
    }
  }
}
       

void TIM3_IRQHandler(void)//中断处理程序
{
   
        TIM_ClearITPendingBit(TIM3,TIM_IT_Update);//TIM_ClearITPendingBit(TIM3,TIM_IT_CC2)
       
        IC2_CCR1 = TIM_GetCapture1(TIM3);   //获取周期值CCR1
  IC2_CCR2 = TIM_GetCapture2(TIM3);   //获取高电平时间CCR2
       
  if(IC2_CCR2!=0)
  {
                   PD = ((IC2_CCR1+1)* 100)/(IC2_CCR2+1)*180;
     
                }               
        else
        {
          Freq=0;
          PD=0;
        }       
   
        }
               
        这是我写的程序,搞了好几天了,捕获的脉冲数据始终是0。跪求各位大佬帮我看看,问题到底在哪里?
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-22 16:18:21 | 显示全部楼层
尝试过,把显示程序放到中断里,显示数据也一直是0.
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-22 16:20:30 | 显示全部楼层
是用的proteus仿真,STM32F103R6+LCD602。单独仿真显示部分是正常的。
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-22 16:29:09 | 显示全部楼层
quanyu520 发表于 2022-7-22 13:57
输入捕获的中断 得到占空比 存款冲区,另外的中断或者循环   lcd显示缓冲区的占空比

大佬,能说具体点吗?我是小白
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-7-22 19:01:34 | 显示全部楼层
本帖最后由 LcwSwust 于 2022-7-22 19:02 编辑
77chl 发表于 2022-7-22 16:10
//STM32单片机控制LCD1602,在LCD1602的第一行显示测量值val

#include "stdio.h"

需点击楼层左下角“回复”。
程序中,后面那个while(1)里并未读取PD,未将其显示出来。
专治疑难杂症
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-22 20:05:48 | 显示全部楼层
LcwSwust 发表于 2022-7-22 19:01
需点击楼层左下角“回复”。
程序中,后面那个while(1)里并未读取PD,未将其显示出来。

我试过把  sprintf(Table2,"%.2f",PD);  加到后面那个while(1)里,还是显示0.00。
可只要把else后面语句里给PD赋值,比如:
else
        {
          Freq=0;
          PD=57.894;
        }       
显示的数据就是PD=57.89,似乎就对了。我判断是中断读取的数值是0,不明白为什么这样。
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-22 20:10:46 | 显示全部楼层
IC2_CCR2 = TIM_GetCapture2(TIM3);

是不是这个抓取值始终为0呀?
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-7-22 20:46:59 | 显示全部楼层
LcwSwust 发表于 2022-7-22 19:01
需点击楼层左下角“回复”。
程序中,后面那个while(1)里并未读取PD,未将其显示出来。

那你看下进中断没,以及IC2_CCR1,IC2_CCR2的值。
专治疑难杂症
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-23 09:17:05 | 显示全部楼层
LcwSwust 发表于 2022-7-22 20:46
那你看下进中断没,以及IC2_CCR1,IC2_CCR2的值。

进中断了,但IC2_CCR1,IC2_CCR2的值都是0
回复

使用道具 举报

12

主题

3380

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8608
金钱
8608
注册时间
2020-5-11
在线时间
4042 小时
发表于 2022-7-23 09:32:14 | 显示全部楼层
77chl 发表于 2022-7-23 09:17
进中断了,但IC2_CCR1,IC2_CCR2的值都是0

我不太了解这种用法,一般要用定时器不都要初始化吗,还有选择分频什么的,你这里只有PWMI初始化,可能缺了某些初始化。
比如:TIM_DeInit,TIM_TimeBaseInit。
专治疑难杂症
回复

使用道具 举报

1

主题

18

帖子

0

精华

初级会员

Rank: 2

积分
50
金钱
50
注册时间
2021-4-28
在线时间
16 小时
 楼主| 发表于 2022-7-23 11:01:30 | 显示全部楼层
LcwSwust 发表于 2022-7-23 09:32
我不太了解这种用法,一般要用定时器不都要初始化吗,还有选择分频什么的,你这里只有PWMI初始化,可能缺 ...

初始化配置用的ST官方例程,中断程序也是根据书上的例程稍作修改,检查n编了,没有发现问题。
唯一怀疑的是与原子哥的延时函数是否有冲突?
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-4-26 19:02

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表