精英版(zet6)TIM8输出PWM

2019-10-14 21:53发布

这是我写的初始化pwm_init()函数#include "pwm.h"
#include "stm32f10x.h"

u32 w1,w2,w3,w4;

void pwm_init(void)
{
        GPIO_InitTypeDef GPIO_InitStruct;
        TIM_TimeBaseInitTypeDef TIM_TimeBaseInitStruct;
        TIM_OCInitTypeDef TIM_OCInitStruct;
       
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_TIM8,ENABLE);
       
        GPIO_InitStruct.GPIO_Mode =GPIO_Mode_AF_PP;
        GPIO_InitStruct.GPIO_Pin =GPIO_Pin_6|GPIO_Pin_7|GPIO_Pin_8|GPIO_Pin_9;
        GPIO_InitStruct.GPIO_Speed =GPIO_Speed_50MHz;
        GPIO_Init(GPIOC,&GPIO_InitStruct);
       
        TIM_TimeBaseInitStruct.TIM_ClockDivision =TIM_CKD_DIV1;
        TIM_TimeBaseInitStruct.TIM_CounterMode =TIM_CounterMode_Up;
        TIM_TimeBaseInitStruct.TIM_Period =999;
        TIM_TimeBaseInitStruct.TIM_Prescaler =0;
       
        TIM_TimeBaseInit(TIM8,&TIM_TimeBaseInitStruct);
       
        TIM_OCInitStruct.TIM_OCMode =TIM_OCMode_PWM1;
        TIM_OCInitStruct.TIM_OCPolarity =TIM_OCPolarity_High;
        TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_Pulse =w1;
       
  TIM_OC1Init(TIM8,&TIM_OCInitStruct);
        TIM_OC1PreloadConfig(TIM8,TIM_OCPreload_Enable);
       
        TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_Pulse =w2;
        TIM_OC2Init(TIM8,&TIM_OCInitStruct);
        TIM_OC2PreloadConfig(TIM8,TIM_OCPreload_Enable);
       
        TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_Pulse =w3;
        TIM_OC3Init(TIM8,&TIM_OCInitStruct);
        TIM_OC3PreloadConfig(TIM8,TIM_OCPreload_Enable);
       
        TIM_OCInitStruct.TIM_OutputState =TIM_OutputState_Enable;
        TIM_OCInitStruct.TIM_Pulse =w4;
        TIM_OC4Init(TIM8,&TIM_OCInitStruct);
        TIM_OC4PreloadConfig(TIM8,TIM_OCPreload_Enable);
       
        TIM_ARRPreloadConfig(TIM8,ENABLE);
        TIM_Cmd(TIM8,ENABLE);
}
与TIM3输出PWM配置除了引脚和时钟不同,其他应该都是一样的。
主函数
#include "stm32f10x.h"
#include "lcd.h"
#include "delay.h"
#include "usart.h"
#include "pwm.h"

extern u32 w1,w2,w3,w4;     //w1Ç°×óÂÖ£¬w2oó×óÂÖ£¬w3Ç°óòÂÖ£¬w4oóóòÂÖ

int main (void)
{
        delay_init();
        uart_init(115200);
        LCD_Init();
        pwm_init();
        POINT_COLOR=RED;
        LCD_Clear(GRAY);
        POINT_COLOR=RED;             
  LCD_ShowString(20,170,200,16,16,"W1:");
        LCD_ShowString(20,190,200,16,16,"W2:");
        LCD_ShowString(20,210,200,16,16,"W3:");
        LCD_ShowString(20,230,200,16,16,"W4:");
        w1=w2=w3=w4=500;
        while(1)
        {
          w1+=5;
                w2+=10;
                w3-=5;
                w4-=10;
                LCD_ShowNum(60,170,w1,16,16);
                LCD_ShowNum(60,190,w2,16,16);
                LCD_ShowNum(60,210,w3,16,16);
                LCD_ShowNum(60,230,w4,16,16);
                pwm_init();
                delay_ms(100);
                if(w1>950|w2>950|w3<50|w4<50)
                {
                        if(w1>950)w1=500;
                        if(w2>950)w2=500;
                        if(w3<50)w3=500;
                        if(w4<50)w4=500;
                }
        }
}
LCD程序是原子哥给的历程里面移植过来的,显示能够正常显示W1,W2,W3,W4四个值得变化,但是输出的电机就是不转。

之前使用TIM3输出PWM控制电机转速的   但是TIM3有一个通道与LCD的引脚共用了  
为了不与LCD冲突,通过查看精英版的芯片引脚,发现TIM8很合适,所以才决定使用TIM8输出PWM控制电机,现在的问题就是使用TIM8输出PWM波,电机没反应,如果用TIM3输出PWM的话能够正常转动,但就是会影响LCD的亮度。
难道高级定时器的配置与通用定时器的配置不一样吗?
我上传了精英版芯片引脚图,望大神能够帮忙解答,谢谢

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
6条回答
wanqigui
1楼-- · 2019-10-14 22:15
通过观看原子哥后续的视频解说,发现使用TIM8定时器要开启一个特定的函数,不然无法正常使用TIM8定时器。具体是哪一个视频名称忘记了
wanqigui
2楼-- · 2019-10-15 03:30
SDIO和OLCD都没有使能。开始担心是和其他硬件连接了,导致输出PWM没有,但是找了半天也没发现。现在又是,3和4通道连接的电机在开机那一会会以全速转动一下(很快的一下),而且还是全速转动。而1和2通道连接的电机根本没反应。之前用TIM3也没出现过这种情况(电机接线我再次确定接的确实是PC6789口)
不死鸟
3楼-- · 2019-10-15 06:24
楼主,管脚有PWM波形输出么?
wanqigui
4楼-- · 2019-10-15 08:45
不死鸟 发表于 2017-1-10 11:53
楼主,管脚有PWM波形输出么?

我用示波器测过了   四个引脚全是低电平。就好像全部被置位了一样。
chengyuanting
5楼-- · 2019-10-15 10:56
 精彩回答 2  元偷偷看……
wanqigui
6楼-- · 2019-10-15 14:39
chengyuanting 发表于 2017-3-2 16:40
什么函数啊?

void TIM_CtrlPWMOutputs(TIM_TypeDef* TIMx, FunctionalState NewState);
这个函数    在原子哥的49讲视频PWM_DAC视频(精英版)第20分钟开始有说开启高级定时器必须要调用这个函数

一周热门 更多>