野火电子论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

查看: 14556|回复: 19

定时器4 输出四路PWM

[复制链接]
发表于 2016-12-8 11:40:09 | 显示全部楼层 |阅读模式
本帖最后由 wangjie1221 于 2016-12-8 12:46 编辑

L298N驱动两个电机调速,利用定时器4输出四路PWM,通道1PB6,通道2PB7,通道3PB8,通道4PB9 。PB6和PB7控制一个电机,PB8和PB9控制另个电机
KEY1按下同时输出占空比100%的方波,当按下KEY2按下同时输出占空比50%方波。
两个波形都正确,但是当我按下复位键且没有按下KEY2时,用万用表测量PB8和PB9的电压就输出负的电源电压,请问为什么????急需要解决!
  1. [/font][/align][align=left][font=宋体][align=left]#include "stm32f10x.h"[/align][align=left]#define TIM2_GPIO1_Pin        GPIO_Pin_6                                                        //前左INT1 [/align][align=left]#define TIM2_GPIO1_Port        GPIOB[/align][align=left]#define TIM2_GPIO1_Clk        RCC_APB2Periph_GPIOB[/align][align=left]#define TIM2_GPIO2_Pin        GPIO_Pin_7                                                        //前左INT2[/align][align=left]#define TIM2_GPIO2_Port        GPIOB[/align][align=left]#define TIM2_GPIO2_Clk        RCC_APB2Periph_GPIOB[/align][align=left]#define TIM2_GPIO3_Pin        GPIO_Pin_8                                                        //前右INT1[/align][align=left]#define TIM2_GPIO3_Port        GPIOB[/align][align=left]#define TIM2_GPIO3_Clk        RCC_APB2Periph_GPIOB[/align][align=left]#define TIM2_GPIO4_Pin        GPIO_Pin_9                                                        //前右INT2[/align][align=left]#define TIM2_GPIO4_Port        GPIOB[/align][align=left]#define TIM2_GPIO4_Clk        RCC_APB2Periph_GPIOB[/align]
  2. [align=left]#define TIM3_GPIO1_Pin        GPIO_Pin_6                                                        //后左INT1[/align][align=left]#define TIM3_GPIO1_Port        GPIOA[/align][align=left]#define TIM3_GPIO1_Clk        RCC_APB2Periph_GPIOA[/align][align=left]#define TIM3_GPIO2_Pin        GPIO_Pin_7                                                        //后左INT2[/align][align=left]#define TIM3_GPIO2_Port        GPIOA[/align][align=left]#define TIM3_GPIO2_Clk        RCC_APB2Periph_GPIOA[/align][align=left]#define TIM3_GPIO3_Pin        GPIO_Pin_0                                                        //后右INT1[/align][align=left]#define TIM3_GPIO3_Port        GPIOB[/align][align=left]#define TIM3_GPIO3_Clk        RCC_APB2Periph_GPIOB[/align][align=left]#define TIM3_GPIO4_Pin        GPIO_Pin_1                                                        //后右INT2[/align][align=left]#define TIM3_GPIO4_Port        GPIOB[/align][align=left]#define TIM3_GPIO4_Clk        RCC_APB2Periph_GPIOB[/align][align=left]/********************基本定时器TIM参数定义,只限TIM6、7************/[/align][align=left]#define             macTIMx2                 TIM4[/align][align=left]#define             macTIM_APBxClock_FUN2    RCC_APB1PeriphClockCmd[/align][align=left]#define             macTIM_CLK2              RCC_APB1Periph_TIM4[/align][align=left]#define             macTIM_IRQ2              TIM4_IRQn[/align][align=left]#define             macTIM_INT_FUN2          TIM4_IRQHandler[/align]
  3. [align=left]#define             macTIMx                 TIM3[/align][align=left]#define             macTIM_APBxClock_FUN    RCC_APB1PeriphClockCmd[/align][align=left]#define             macTIM_CLK              RCC_APB1Periph_TIM3[/align][align=left]#define             macTIM_IRQ              TIM3_IRQn[/align][align=left]#define             macTIM_INT_FUN          TIM3_IRQHandler[/align]
  4. [align=left][align=left]void TIM2_GPIO_Config(void)[/align][align=left]{[/align][align=left]        GPIO_InitTypeDef        TIM2_GPIO_InitStructure;[/align][align=left]        //开GPIOB端口时钟[/align][align=left]        RCC_APB2PeriphClockCmd(TIM2_GPIO1_Clk,ENABLE);[/align][align=left]        //配置PB6口复用推免输出,速度10MHZ[/align][align=left]        TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO1_Pin;                        [/align][align=left]        TIM2_GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;[/align][align=left]        TIM2_GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;[/align][align=left]        GPIO_Init(TIM2_GPIO1_Port, &TIM2_GPIO_InitStructure);[/align]
  5. [align=left]        //配置PB7口复用推免输出,速度10MHZ[/align][align=left]        TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO2_Pin;[/align][align=left]        GPIO_Init(TIM2_GPIO2_Port, &TIM2_GPIO_InitStructure);[/align]
  6. [align=left]        //配置PB8口复用推免输出,速度10MHZ[/align][align=left]        TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO3_Pin;[/align][align=left]        GPIO_Init(TIM2_GPIO3_Port, &TIM2_GPIO_InitStructure);[/align][align=left]        //配置PB9口复用推免输出,速度10MHZ[/align][align=left]        TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO4_Pin;[/align][align=left]        GPIO_Init(TIM2_GPIO4_Port, &TIM2_GPIO_InitStructure);[/align][align=left]}[/align][align=left]static void TIM3_GPIO_Config(void)[/align][align=left]{[/align][align=left]        GPIO_InitTypeDef        TIM3_GPIO_InitStructure;[/align][align=left]        //开GPIOA端口时钟[/align][align=left]        RCC_APB2PeriphClockCmd(TIM3_GPIO1_Clk,ENABLE);[/align][align=left]        //配置PA6口复用推免输出,速度10MHZ[/align][align=left]        TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO1_Pin;                        [/align][align=left]        TIM3_GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;[/align][align=left]        TIM3_GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;[/align][align=left]        GPIO_Init(TIM3_GPIO1_Port, &TIM3_GPIO_InitStructure);[/align][align=left]        //配置PA7口复用推免输出,速度10MHZ[/align][align=left]        TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO2_Pin;[/align][align=left]        GPIO_Init(TIM3_GPIO2_Port, &TIM3_GPIO_InitStructure);[/align][align=left]        //打开GPIOB时钟[/align][align=left]        RCC_APB2PeriphClockCmd(TIM3_GPIO3_Clk,ENABLE);[/align][align=left]        //配置PB0口复用推免输出,速度10MHZ[/align][align=left]        TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO3_Pin;[/align][align=left]        GPIO_Init(TIM3_GPIO3_Port, &TIM3_GPIO_InitStructure);[/align][align=left]        //配置PB1口复用推免输出,速度10MHZ[/align][align=left]        TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO4_Pin;[/align][align=left]        GPIO_Init(TIM3_GPIO4_Port, &TIM3_GPIO_InitStructure);[/align][align=left]}[/align]
  7. [align=left][align=left]static void TIM2_PWM100_QJConfig(void)[/align][align=left]{[/align][align=left]                uint16_t CCR1_Val=1000;                        //B6占空比100%[/align][align=left]                uint16_t CCR2_Val=0;                                //B7占空比0[/align][align=left]                uint16_t CCR3_Val=1000;                        //B8占空比100%[/align][align=left]          uint16_t CCR4_Val=0;                                //B9占空比0[/align][align=left]                TIM_OCInitTypeDef                                TIM_OCInitStructure;[/align][align=left]                      //PWM模式配置[/align][align=left]                //PWM1模式1[/align][align=left]                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;[/align][align=left]                //PWM输出使能[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR1_Val;[/align][align=left]                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;[/align][align=left]                //使能通道1[/align][align=left]                TIM_OC1Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC1PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                //PWM2模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR2_Val;[/align][align=left]                //使能通道2[/align][align=left]                TIM_OC2Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC2PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                //PWM3模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR3_Val;[/align][align=left]                //使能通道3[/align][align=left]                TIM_OC3Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC3PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                //PWM4模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR4_Val;[/align][align=left]                //使能通道4[/align][align=left]                TIM_OC4Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC4PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                [/align][align=left]                TIM_ARRPreloadConfig(macTIMx2, ENABLE);[/align][align=left]                TIM_Cmd(macTIMx2, ENABLE);[/align]
  8. [align=left]}[/align][align=left]static void TIM2_PWM50_QJConfig(void)[/align][align=left]{[/align][align=left]                uint16_t CCR1_Val=500;                        //B6占空比50%[/align][align=left]                uint16_t CCR2_Val=0;                                //B7占空比0[/align][align=left]                uint16_t CCR3_Val=500;                        //B8占空比50%[/align][align=left]          uint16_t CCR4_Val=0;                                //B9占空比0[/align][align=left]                TIM_OCInitTypeDef                                TIM_OCInitStructure;[/align][align=left]                      //PWM模式配置[/align][align=left]                //PWM1模式1[/align][align=left]                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;[/align][align=left]                //PWM输出使能[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR1_Val;[/align][align=left]                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;[/align][align=left]                //使能通道1[/align][align=left]                TIM_OC1Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC1PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                //PWM2模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR2_Val;[/align][align=left]                //使能通道2[/align][align=left]                TIM_OC2Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC2PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                //PWM3模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR3_Val;[/align][align=left]                //使能通道3[/align][align=left]                TIM_OC3Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC3PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                //PWM4模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR4_Val;[/align][align=left]                //使能通道4[/align][align=left]                TIM_OC4Init(macTIMx2,&TIM_OCInitStructure);[/align][align=left]                TIM_OC4PreloadConfig(macTIMx2, TIM_OCPreload_Enable);[/align][align=left]                [/align][align=left]                TIM_ARRPreloadConfig(macTIMx2, ENABLE);[/align][align=left]                TIM_Cmd(macTIMx2, ENABLE);[/align]
  9. [align=left]}[/align]
  10. [align=left][align=left]static void TIM3_PWM100_QJConfig(void)[/align][align=left]{[/align][align=left]                uint16_t CCR1_Val=1000;                        //A6占空比100%[/align][align=left]                uint16_t CCR2_Val=0;                                 //A7占空比0[/align][align=left]                uint16_t CCR3_Val=1000;                        //B0占空比100%[/align][align=left]          uint16_t CCR4_Val=0;                                //B1占空比0[/align][align=left]                TIM_OCInitTypeDef                                TIM_OCInitStructure;[/align][align=left]                      //PWM模式配置[/align][align=left]                //PWM1模式1[/align][align=left]                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;[/align][align=left]                //PWM输出使能[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR1_Val;[/align][align=left]                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;[/align][align=left]                //使能通道1[/align][align=left]                TIM_OC1Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC1PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                //PWM2模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR2_Val;[/align][align=left]                //使能通道2[/align][align=left]                TIM_OC2Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC2PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                //PWM3模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR3_Val;[/align][align=left]                //使能通道3[/align][align=left]                TIM_OC3Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC3PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                //PWM4模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR4_Val;[/align][align=left]                //使能通道4[/align][align=left]                TIM_OC4Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC4PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                [/align][align=left]                TIM_ARRPreloadConfig(macTIMx, ENABLE);[/align][align=left]                TIM_Cmd(macTIMx, ENABLE);[/align]
  11. [align=left]}[/align][align=left]static void TIM3_PWM50_QJConfig(void)[/align][align=left]{[/align][align=left]                uint16_t CCR1_Val=500;                        //A6占空比50%[/align][align=left]                uint16_t CCR2_Val=0;                                 //A7占空比0[/align][align=left]                uint16_t CCR3_Val=500;                        //B0占空比50%[/align][align=left]          uint16_t CCR4_Val=0;                                //B1占空比0[/align][align=left]                TIM_OCInitTypeDef                                TIM_OCInitStructure;[/align][align=left]                      //PWM模式配置[/align][align=left]                //PWM1模式1[/align][align=left]                TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;[/align][align=left]                //PWM输出使能[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR1_Val;[/align][align=left]                TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;[/align][align=left]                //使能通道1[/align][align=left]                TIM_OC1Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC1PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                //PWM2模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR2_Val;[/align][align=left]                //使能通道2[/align][align=left]                TIM_OC2Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC2PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                //PWM3模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR3_Val;[/align][align=left]                //使能通道3[/align][align=left]                TIM_OC3Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC3PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                //PWM4模式1[/align][align=left]                TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;[/align][align=left]                TIM_OCInitStructure.TIM_Pulse=CCR4_Val;[/align][align=left]                //使能通道4[/align][align=left]                TIM_OC4Init(macTIMx,&TIM_OCInitStructure);[/align][align=left]                TIM_OC4PreloadConfig(macTIMx, TIM_OCPreload_Enable);[/align][align=left]                [/align][align=left]                TIM_ARRPreloadConfig(macTIMx, ENABLE);[/align][align=left]                TIM_Cmd(macTIMx, ENABLE);[/align]
  12. [align=left]}[/align]
  13. //电机正转,占空比为100%
  14. void QJTIM2_PWM100_Init(void)
  15. {
  16.         TIM2_GPIO_Config();
  17.         TIM2_100QJConfiguration();
  18.         //TIMx_NVIC_Configuration();
  19. }

  20. void QJTIM3_PWM100_Init(void)
  21. {
  22.         TIM3_GPIO_Config();
  23.         TIM3_100QJConfiguration();
  24.         //TIMx_NVIC_Configuration();
  25. }
  26. //电机正转,占空比为50%
  27. void QJTIM2_PWM50_Init(void)
  28. {
  29.         TIM2_GPIO_Config();
  30.         TIM2_50QJConfiguration();
  31.         //TIMx_NVIC_Configuration();
  32. }

  33. void QJTIM3_PWM50_Init(void)
  34. {
  35.         TIM3_GPIO_Config();
  36.         TIM3_50QJConfiguration();
  37.         //TIMx_NVIC_Configuration();
  38. }


  39. //主函数
  40. int main(void)
  41. {
  42.        
  43.         KEY_GPIO_Init();
  44.         //TIM2_GPIO_Config();
  45.         //GPIOB->ODR|=0xFFFFFFFF;//ODR必须清零
  46.         while(1)
  47.         {
  48.                         if(KEY_Scan(KEY1_GPIO_Port,KEY1_GPIO_Pin )==KEY_ON)
  49.                 {
  50.                                 QJTIM2_PWM50_Init();
  51.                                 QJTIM3_PWM50_Init();
  52.                                 macTIM_APBxClock_FUN2 (macTIM_CLK2, ENABLE);
  53.                                 macTIM_APBxClock_FUN (macTIM_CLK, ENABLE);
  54.                 }
  55.                 if(KEY_Scan(KEY2_GPIO_Port,KEY2_GPIO_Pin )==KEY_ON)
  56.                 {
  57.                                 QJTIM2_PWM100_Init();
  58.                                 QJTIM3_PWM100_Init();
  59.                                 macTIM_APBxClock_FUN2 (macTIM_CLK2, ENABLE);
  60.                                 macTIM_APBxClock_FUN (macTIM_CLK, ENABLE);
  61.                 }               
  62.         }
  63. }

  64. [/align][/align][/align][/font][/align][align=left][font=宋体]
复制代码
    L298N接12V电池,按下复位键,用万用表测得OUT1与OUT2的电压为负的12V
回复

使用道具 举报

发表于 2016-12-8 12:00:35 | 显示全部楼层
整个板子最低的电压是0V,怎么会出现负电压。 你把电机断开再测试看看,估计是电机启动时候的反电动势影响到了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 12:48:31 | 显示全部楼层
本帖最后由 wangjie1221 于 2016-12-8 12:56 编辑
fire 发表于 2016-12-8 12:00
整个板子最低的电压是0V,怎么会出现负电压。 你把电机断开再测试看看,估计是电机启动时候的反电动势影响 ...

L298N接12V电池,按下复位键,未接电机时用万用表测得OUT3与OUT4的电压为负的12V也可以这样说 按下复位键后  PB8被置0,PB9被置1,故输出-12V  为什么?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 12:55:02 | 显示全部楼层
wangjie1221 发表于 2016-12-8 12:48
L298N接12V电池,按下复位键,未接电机时用万用表测得OUT3与OUT4的电压为负的12V

也可以这样说 按下复位键后  PB8被置0,PB9被置1,故输出-12V  为什么?
回复 支持 反对

使用道具 举报

发表于 2016-12-8 14:17:49 | 显示全部楼层
wangjie1221 发表于 2016-12-8 12:55
也可以这样说 按下复位键后  PB8被置0,PB9被置1,故输出-12V  为什么?

真为楼主的表达抓急,L298N是全桥输出,你单纯量OUT3,OUT4当然有正电压由负电压啊
回复 支持 反对

使用道具 举报

发表于 2016-12-8 14:30:54 | 显示全部楼层
cancore 发表于 2016-12-8 14:17
真为楼主的表达抓急,L298N是全桥输出,你单纯量OUT3,OUT4当然有正电压由负电压啊

L298N.jpg

具体你看它的内部框架和电流流向就明白了
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 14:59:20 | 显示全部楼层
cancore 发表于 2016-12-8 14:30
具体你看它的内部框架和电流流向就明白了

大哥,当PB8=0,PB9=1,肯定OUT3和OUT4电压为-12.我的意思是按下复位键,不知为什么PB8,PB9分别被置为0,1,本来复位之后都为0,两端是无电压。
回复 支持 反对

使用道具 举报

发表于 2016-12-8 15:36:01 | 显示全部楼层
你还是传代码吧,你这代码贴得眼花···········在画张图把单片机和298引脚对应连接起来,这样才好分析啊·····
回复 支持 反对

使用道具 举报

发表于 2016-12-8 15:50:23 | 显示全部楼层
wangjie1221 发表于 2016-12-8 14:59
大哥,当PB8=0,PB9=1,肯定OUT3和OUT4电压为-12.我的意思是按下复位键,不知为什么PB8,PB9分别被置为0, ...

绕了半天,我算是明白了
检查PB8和PB9的初始化状态,全部置0能不能解决。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 16:35:44 | 显示全部楼层
本帖最后由 wangjie1221 于 2016-12-8 16:49 编辑
qq4222 发表于 2016-12-8 15:36
你还是传代码吧,你这代码贴得眼花···········在画张图把单片机和298引脚对应连接起来,这样才 ...

  1. #define             macTIMx2                 TIM4
  2. #define             macTIM_APBxClock_FUN2    RCC_APB1PeriphClockCmd
  3. #define             macTIM_CLK2              RCC_APB1Periph_TIM4
  4. #define             macTIM_IRQ2              TIM4_IRQn
  5. #define             macTIM_INT_FUN2          TIM4_IRQHandler

  6. #include "bsp-TIMbase.h"
  7. void TIM2_GPIO_Config(void)
  8. {
  9.         GPIO_InitTypeDef        TIM2_GPIO_InitStructure;
  10.         //开GPIOB端口时钟
  11.         RCC_APB2PeriphClockCmd(TIM2_GPIO1_Clk,ENABLE);
  12.         //配置PB6口复用推免输出,速度10MHZ
  13.         TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO1_Pin;                        
  14.         TIM2_GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
  15.         TIM2_GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  16.         GPIO_Init(TIM2_GPIO1_Port, &TIM2_GPIO_InitStructure);
  17.         //配置PB7口复用推免输出,速度10MHZ
  18.         TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO2_Pin;
  19.         GPIO_Init(TIM2_GPIO2_Port, &TIM2_GPIO_InitStructure);
  20.         //配置PB8口复用推免输出,速度10MHZ
  21.         TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO3_Pin;
  22.         GPIO_Init(TIM2_GPIO3_Port, &TIM2_GPIO_InitStructure);
  23.         //配置PB9口复用推免输出,速度10MHZ
  24.         TIM2_GPIO_InitStructure.GPIO_Pin=TIM2_GPIO4_Pin;
  25.         GPIO_Init(TIM2_GPIO4_Port, &TIM2_GPIO_InitStructure);
  26. }
  27. static void TIM3_GPIO_Config(void)
  28. {
  29.         GPIO_InitTypeDef        TIM3_GPIO_InitStructure;
  30.         //开GPIOA端口时钟
  31.         RCC_APB2PeriphClockCmd(TIM3_GPIO1_Clk,ENABLE);
  32.         //配置PA6口复用推免输出,速度10MHZ
  33.         TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO1_Pin;                        
  34.         TIM3_GPIO_InitStructure.GPIO_Speed=GPIO_Speed_10MHz;
  35.         TIM3_GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;
  36.         GPIO_Init(TIM3_GPIO1_Port, &TIM3_GPIO_InitStructure);
  37.         //配置PA7口复用推免输出,速度10MHZ
  38.         TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO2_Pin;
  39.         GPIO_Init(TIM3_GPIO2_Port, &TIM3_GPIO_InitStructure);
  40.         //打开GPIOB时钟
  41.         RCC_APB2PeriphClockCmd(TIM3_GPIO3_Clk,ENABLE);
  42.         //配置PB0口复用推免输出,速度10MHZ
  43.         TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO3_Pin;
  44.         GPIO_Init(TIM3_GPIO3_Port, &TIM3_GPIO_InitStructure);
  45.         //配置PB1口复用推免输出,速度10MHZ
  46.         TIM3_GPIO_InitStructure.GPIO_Pin=TIM3_GPIO4_Pin;
  47.         GPIO_Init(TIM3_GPIO4_Port, &TIM3_GPIO_InitStructure);
  48. }

  49. static void TIM2_PWM100_QJConfig(void)
  50. {
  51.                 uint16_t CCR1_Val=1000;                        //B6占空比100%
  52.                 uint16_t CCR2_Val=0;                                //B7占空比0
  53.                 uint16_t CCR3_Val=1000;                        //B8占空比100%
  54.           uint16_t CCR4_Val=0;                                //B9占空比0
  55.                 TIM_OCInitTypeDef                                TIM_OCInitStructure;
  56.                       //PWM模式配置
  57.                 //PWM1模式1
  58.                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  59.                 //PWM输出使能
  60.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  61.                 TIM_OCInitStructure.TIM_Pulse=CCR1_Val;
  62.                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  63.                 //使能通道1
  64.                 TIM_OC1Init(macTIMx2,&TIM_OCInitStructure);
  65.                 TIM_OC1PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  66.                 //PWM2模式1
  67.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  68.                 TIM_OCInitStructure.TIM_Pulse=CCR2_Val;
  69.                 //使能通道2
  70.                 TIM_OC2Init(macTIMx2,&TIM_OCInitStructure);
  71.                 TIM_OC2PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  72.                 //PWM3模式1
  73.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  74.                 TIM_OCInitStructure.TIM_Pulse=CCR3_Val;
  75.                 //使能通道3
  76.                 TIM_OC3Init(macTIMx2,&TIM_OCInitStructure);
  77.                 TIM_OC3PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  78.                 //PWM4模式1
  79.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  80.                 TIM_OCInitStructure.TIM_Pulse=CCR4_Val;
  81.                 //使能通道4
  82.                 TIM_OC4Init(macTIMx2,&TIM_OCInitStructure);
  83.                 TIM_OC4PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  84.                
  85.                 TIM_ARRPreloadConfig(macTIMx2, ENABLE);
  86.                 TIM_Cmd(macTIMx2, ENABLE);

  87. }
  88. static void TIM2_PWM50_QJConfig(void)
  89. {
  90.                 uint16_t CCR1_Val=500;                        //B6占空比50%
  91.                 uint16_t CCR2_Val=0;                                //B7占空比0
  92.                 uint16_t CCR3_Val=500;                        //B8占空比50%
  93.           uint16_t CCR4_Val=0;                                //B9占空比0
  94.                 TIM_OCInitTypeDef                                TIM_OCInitStructure;
  95.                       //PWM模式配置
  96.                 //PWM1模式1
  97.                 TIM_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM1;
  98.                 //PWM输出使能
  99.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  100.                 TIM_OCInitStructure.TIM_Pulse=CCR1_Val;
  101.                 TIM_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_High;
  102.                 //使能通道1
  103.                 TIM_OC1Init(macTIMx2,&TIM_OCInitStructure);
  104.                 TIM_OC1PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  105.                 //PWM2模式1
  106.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  107.                 TIM_OCInitStructure.TIM_Pulse=CCR2_Val;
  108.                 //使能通道2
  109.                 TIM_OC2Init(macTIMx2,&TIM_OCInitStructure);
  110.                 TIM_OC2PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  111.                 //PWM3模式1
  112.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  113.                 TIM_OCInitStructure.TIM_Pulse=CCR3_Val;
  114.                 //使能通道3
  115.                 TIM_OC3Init(macTIMx2,&TIM_OCInitStructure);
  116.                 TIM_OC3PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  117.                 //PWM4模式1
  118.                 TIM_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
  119.                 TIM_OCInitStructure.TIM_Pulse=CCR4_Val;
  120.                 //使能通道4
  121.                 TIM_OC4Init(macTIMx2,&TIM_OCInitStructure);
  122.                 TIM_OC4PreloadConfig(macTIMx2, TIM_OCPreload_Enable);
  123.                
  124.                 TIM_ARRPreloadConfig(macTIMx2, ENABLE);
  125.                 TIM_Cmd(macTIMx2, ENABLE);

  126. }

  127. //电机正转,占空比为100%
  128. void QJTIM2_PWM100_Init(void)
  129. {
  130.         TIM2_GPIO_Config();
  131.         TIM2_100QJConfiguration();
  132.         //TIMx_NVIC_Configuration();
  133. }

  134. //电机正转,占空比为50%
  135. void QJTIM2_PWM50_Init(void)
  136. {
  137.         TIM2_GPIO_Config();
  138.         TIM2_50QJConfiguration();
  139.         //TIMx_NVIC_Configuration();
  140. }


  141. int main(void)
  142. {
  143.         
  144.         KEY_GPIO_Init();
  145.         while(1)
  146.         {
  147.                         if(KEY_Scan(KEY1_GPIO_Port,KEY1_GPIO_Pin )==KEY_ON)
  148.                 {
  149.                                 QJTIM2_PWM50_Init();
  150.                                 macTIM_APBxClock_FUN2 (macTIM_CLK2, ENABLE);
  151.                 }
  152.                 if(KEY_Scan(KEY2_GPIO_Port,KEY2_GPIO_Pin )==KEY_ON)
  153.                 {
  154.                                 QJTIM2_PWM100_Init();
  155.                                 macTIM_APBxClock_FUN2 (macTIM_CLK2, ENABLE);
  156.                 }               
  157.         }
  158. }
  159. [img]
  160. [/img]
复制代码

L298N与STM32连接图

L298N与STM32连接图
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 16:53:33 | 显示全部楼层
cancore 发表于 2016-12-8 15:50
绕了半天,我算是明白了
检查PB8和PB9的初始化状态,全部置0能不能解决。

我试过在main()函数加这两句
TIM2_GPIO_Config();
GPIOB->ODR|=0xFFFFFFFF;
可以实现,但是有问题,电压会有调变,电压不能瞬间变为零,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 16:56:49 | 显示全部楼层
cancore 发表于 2016-12-8 15:50
绕了半天,我算是明白了
检查PB8和PB9的初始化状态,全部置0能不能解决。

主要是为啥按下复位键,定时器4的通道3和通道4会出现那种情况,定时器3都没有出现这种情况
回复 支持 反对

使用道具 举报

发表于 2016-12-8 17:08:59 | 显示全部楼层
感觉你接线怪怪的,L298正确的打开方式不是用两路PWM 分别控制两路使能端,四路IO控制电机正反转吗?你的图我怎么觉得你直接用两路PWM控制电机了······
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 17:21:44 | 显示全部楼层
qq4222 发表于 2016-12-8 17:08
感觉你接线怪怪的,L298正确的打开方式不是用两路PWM 分别控制两路使能端,四路IO控制电机正反转吗?你的图 ...

对  PWM直接接电机   接使能端是错误的,
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 17:22:48 | 显示全部楼层
wangjie1221 发表于 2016-12-8 17:21
对  PWM直接接电机   接使能端是错误的,

完全可以正反转
回复 支持 反对

使用道具 举报

发表于 2016-12-8 17:29:13 | 显示全部楼层
是能正反转,那样子你要控制PWM为互补输出才行。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 17:33:45 | 显示全部楼层
本帖最后由 wangjie1221 于 2016-12-8 17:35 编辑

我也想把PWM接使能端 我早试过了  也能调速  但是电压不对 ,得不出电机两端电压与占空比成正比  所以我把PWM直接接电机了  这样才能得出正确结论
回复 支持 反对

使用道具 举报

发表于 2016-12-8 17:43:13 | 显示全部楼层
wangjie1221 发表于 2016-12-8 16:53
我试过在main()函数加这两句
TIM2_GPIO_Config();
GPIOB->ODR|=0xFFFFFFFF;

不是这样设置,是你定时器的初始化有问题,输出有个空闲电平的,你要设置为低
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 19:19:06 | 显示全部楼层
cancore 发表于 2016-12-8 17:43
不是这样设置,是你定时器的初始化有问题,输出有个空闲电平的,你要设置为低

我用的是通用定时器4,空闲电平是高级定时器特有的,  我试试看
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-12-8 19:28:17 | 显示全部楼层
cancore 发表于 2016-12-8 17:43
不是这样设置,是你定时器的初始化有问题,输出有个空闲电平的,你要设置为低

TIM_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;
不行  空闲电平是高级定时器特有的
回复 支持 反对

使用道具 举报

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

本版积分规则

联系站长|手机版|野火电子官网|野火淘宝店铺|野火电子论坛 ( 粤ICP备14069197号 ) 大学生ARM嵌入式2群

GMT+8, 2024-11-23 08:40 , Processed in 0.044177 second(s), 26 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

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