OpenEdv-开源电子网

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

想问下大家,按键为什么还没按下pwm脉冲就改变了呀?正常的应该是按键按下才改变pwm的占空比,我的按键也初始化和扫描过

[复制链接]

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
发表于 2020-3-30 09:51:26 | 显示全部楼层 |阅读模式
1金钱
//主函数#include "LED.h"
#include "delay.h"
#include "sys.h"
#include "key.h"
#include "usart.h"
#include "exti.h"
#include "pwm.h"
#include "smg.h"
#include "camer.h"
#include "stm32f10x.h"
#include "extern.h"
#include "switch.h"
#include "detect.h"
#include "ec11.h"
extern u8 switch_sta;
extern u16 ccr;
u8 key_val;

int main(void)
{
         //串口2
        SystemInit();
        delay_init();                 //延时函数初始化       
        uart_init(9600);         //串口初始化为9600
    //NVIC_PriorityGroupConfig(NVIC_PriorityGroup_0);// 设置中断优先级分组           
        LED_Init();                           //初始化与LED连接的硬件接口
        KEY_Init();               
        SMG_Init();
        camer_Init();
        TIM4_PWM_Init(35999,1);     //pwm频率为1khz,周期为1ms
        switch_Init();
        detect_Init();
        //TIM8_Cap_Init(0xffff,71);   //计数频率为1MHZ
    //TIM1_Cap_Init(3599,1);     //定时器的中断时间
        ec11_Init();
        key_val=key_scan(0);
         while(1)
{       
       
       
    switch(key_val){
       
                case KEY0_Press:   
                 if(ccr<35999)
                         {
                                 ccr+=5000;
                         }
                         else
                                 ccr=0;
                 TIM_SetCompare1(TIM4,ccr);
                 TIM_SetCompare2(TIM4,ccr);
                 TIM_SetCompare3(TIM4,ccr);
                 TIM_SetCompare4(TIM4,ccr);
                break;
       
        case KEY1_Press:
                     if(ccr>5000)
                         {
                                 ccr-=5000;
                         }
                         else
                                 ccr=35999;
                     TIM_SetCompare1(TIM4,ccr);
                     TIM_SetCompare2(TIM4,ccr);
                     TIM_SetCompare3(TIM4,ccr);
                     TIM_SetCompare4(TIM4,ccr);
                break;
       
        }

}
//pwm的初始化
void TIM4_PWM_Init(u16 arr,u16 psc)
{  
         GPIO_InitTypeDef GPIO_InitStructure;
        TIM_TimeBaseInitTypeDef  TIM4_TimeBaseStructure;
        TIM_OCInitTypeDef  TIM4_OCInitStructure;
    KEY_Init();
        RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);
        //RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_AFIO, ENABLE);  //使能GPIO外设时钟使能
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);                                                                            

   //输出TIM4 CH1/CH2/CH3/CH4的PWM脉冲波形
        GPIO_InitStructure.GPIO_Pin = GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;  //复用推挽输出
        GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
        GPIO_Init(GPIOB, &GPIO_InitStructure);
    //GPIO_PinRemapConfig(GPIO_FullRemap_TIM3,ENABLE);        
        //GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);
       
        TIM4_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值         
        TIM4_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值  不分频

        TIM4_TimeBaseStructure.TIM_ClockDivision = 0;     //设置时钟分割:TDTS = Tck_tim
        TIM4_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up;  //TIM向上计数模式
        TIM_TimeBaseInit(TIM4, &TIM4_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位


        TIM4_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //选择定时器模式:TIM脉冲宽度调制模式2
        TIM4_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //比较输出使能
        TIM4_OCInitStructure.TIM_Pulse =ccr; //设置待装入捕获比较寄存器的脉冲值
        TIM4_OCInitStructure.TIM_OCPolarity = TIM_OCPolarity_High; //输出极性:TIM输出比较极性高
       
        TIM_OC1Init(TIM4, &TIM4_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH1预装载使能       

        TIM_OC2Init(TIM4, &TIM4_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH2预装载使能       

        TIM_OC3Init(TIM3, &TIM4_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH3预装载使能       
       
        TIM_OC4Init(TIM4, &TIM4_OCInitStructure);  //根据TIM_OCInitStruct中指定的参数初始化外设TIMx
    TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);  //CH4预装载使能       


        //TIM_CtrlPWMOutputs(TIM4,ENABLE);        //MOE 主输出使能       
        TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器
        TIM_Cmd(TIM4, ENABLE);  //使能TIM4

}       

正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

6

主题

412

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
2711
金钱
2711
注册时间
2019-8-14
在线时间
414 小时
发表于 2020-3-30 15:20:52 | 显示全部楼层
回复

使用道具 举报

22

主题

73

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
250
金钱
250
注册时间
2020-3-3
在线时间
85 小时
 楼主| 发表于 2020-3-30 16:12:35 | 显示全部楼层

仿真了,但没找到原因
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2025-5-24 04:26

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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