STM32F103求配置一个PWM输出的程序,要求如下

STM32F103求配置一个PWM输出的程序,要求如下,第1张

我这个没有调试过;仅作参考。

//=============================================================================

//定时器4初始化,向上计数,自动装载,作为PWM,在Pb6~Pb9输出,

void Tim4_Init(void)

{

// volatile uint32_t tpdw1;

GPIO_InitTypeDef GPIO_InitStructure;

TIM_TimeBaseInitTypeDef TIM_TimeBaseInitdata; //基本参数

TIM_OCInitTypeDef TIM_OCInitStructure; //PWM输出,

RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4,ENABLE); //开启tim4的clk,

RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4,ENABLE); //通过对应位设置使Tim4寄存器复位,

RCC_APB1PeriphResetCmd(RCC_APB1Periph_TIM4,DISABLE); //退出复位,

//----Pb6~Pb9对应GPIO口初始化----------------------------------------------------

RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); //开启GPIOB时钟,

GPIO_InitStructureGPIO_Pin = GPIO_Pin_6|GPIO_Pin_7

|GPIO_Pin_8|GPIO_Pin_9;

GPIO_InitStructureGPIO_Speed = GPIO_Speed_50MHz;

GPIO_InitStructureGPIO_Mode = GPIO_Mode_AF_PP;

GPIO_Init(GPIOB,&GPIO_InitStructure);

//----Tim4基本参数的初始化----------------------------------------------------

TIM_TimeBaseInitdataTIM_Prescaler = 0x0; //设置tim的预分频系数=0,72M全频,

TIM_TimeBaseInitdataTIM_ClockDivision = TIM_CKD_DIV1; //设置tim的时钟分频因子,Tdts=nTck_int,

TIM_TimeBaseInitdataTIM_CounterMode = TIM_CounterMode_Up; //向上计数,

TIM_TimeBaseInitdataTIM_Period = 0x3fff; //设置tim的自动重载,14位分辨率约439K,

TIM_TimeBaseInitdataTIM_RepetitionCounter = 0x00; //仅用于tim1&tim8,

TIM_TimeBaseInit(TIM4,&TIM_TimeBaseInitdata);

TIM_ARRPreloadConfig(TIM4,ENABLE); //允许Tim2计数器的ARR自动重载缓冲,

//----Tim4的CHx_PWM的初始化参数,-----------------------------------------------

TIM_OCInitStructureTIM_OCMode=TIM_OCMode_PWM1; //设置OC1M[2:0]为pwm1输出模式,OC1REF="1"为有效,

TIM_OCInitStructureTIM_Pulse=0x1fff; //设置占空比时间,值将自动写入CCR1,

TIM_OCInitStructureTIM_OCPolarity=TIM_OCPolarity_High; //设置输出极性,CCER的CC1P位,实际1=OC1REF的有效电平,

TIM_OCInitStructureTIM_OutputState=TIM_OutputState_Enable; //使能该通道输出,CCER的CC1E位,

//----高级定时器才有的参数,----------------------------------------------------

TIM_OCInitStructureTIM_OCIdleState=TIM_OCIdleState_Reset; //空闲/死区输出状态=0,Timx_CR2的OISx,只有Tim1/8有,

TIM_OCInitStructureTIM_OCNIdleState=TIM_OCNIdleState_Reset; //空闲/死区输出状态=0,Timx_CR2的OISxN,只有Tim1/8有,

TIM_OCInitStructureTIM_OCNPolarity=TIM_OCNPolarity_High; //设置互补端输出极性,CCER的CC1NP位,

TIM_OCInitStructureTIM_OutputNState=TIM_OutputNState_Disable; //无互补端输出,CCER的CC1NE位,

//----按照指定参数初始化TIM_OC1~4,

TIM_OC1Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC1,

TIM_OC1FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,

TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR1上的预装载寄存器,CCMR1_OC1PE=1,

TIM_OC2Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC2,

TIM_OC2FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,

TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR2上的预装载寄存器,CCMR1_OC2PE=1,

TIM_OC3Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC3,

TIM_OC3FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,

TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR3上的预装载寄存器,CCMR2_OC3PE=1,

TIM_OC4Init(TIM4,&TIM_OCInitStructure); //按照指定参数初始化TIM_OC4,

TIM_OC4FastConfig(TIM4,TIM_OCFast_Enable); //开启快速输出模式,3周期,

TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable); //使能TIM2在CCR4上的预装载寄存器,CCMR2_OC4PE=1,

//----定时器启动-----------------------

TIM_ITConfig(TIM4,TIM_IT_Update,DISABLE); //关中断,

TIM_ClearFlag(TIM4,TIM_FLAG_Update); //必须先清除配置时候产生的更新标志,

TIM_Cmd(TIM4,ENABLE); //使能定时器,

}

这个挺简单的吧

不知道你的DSP设置情况,我就说下我怎么设置吧。我设置的DSP频率是150M,你要发的PWM波周期是20KHz,设置连续增减模式,计数的最大值应该设为150M/40k=3750,你在设置比较值,如果占空比是50%,就设一半。然后你设个计数值,确定是什么时候开通哪个PWM,定义个flag就可以

了,设置为012,到了你的PWM长度就加1,到3时清0,等于0开PWM1,1开PWM2,2开PWM3就ok了。

看来你是想用串口中断 定时器查询方式 串口中断程序里面为什么会有//这个符号呢?应该去掉吧,//这个是注释用的。还有既然发生中断了RI就肯定是等于1了,没有必要判断是否等于1。另外主程序第一句前面也要去掉//。编程要严谨啊。

PWM0 37

PWM1 35

#include "reg51h"

#include "intrinsh"

#define FOSC 18432000L

typedef unsigned char BYTE;

typedef unsigned int WORD;

/Declare SFR associated with the PCA /

sfr CCON = 0xD8; //PCA control register

sbit CCF0 = CCON^0; //PCA module-0 interrupt flag

sbit CCF1 = CCON^1; //PCA module-1 interrupt flag

sbit CR = CCON^6; //PCA timer run control bit

sbit CF = CCON^7; //PCA timer overflow flag

sfr CMOD = 0xD9; //PCA mode register

sfr CL = 0xE9; //PCA base timer LOW

sfr CH = 0xF9; //PCA base timer HIGH

sfr CCAPM0 = 0xDA; //PCA module-0 mode register

sfr CCAP0L = 0xEA; //PCA module-0 capture register LOW

sfr CCAP0H = 0xFA; //PCA module-0 capture register HIGH

sfr CCAPM1 = 0xDB; //PCA module-1 mode register

sfr CCAP1L = 0xEB; //PCA module-1 capture register LOW

sfr CCAP1H = 0xFB; //PCA module-1 capture register HIGH

sfr CCAPM2 = 0xDC; //PCA module-2 mode register

sfr CCAP2L = 0xEC; //PCA module-2 capture register LOW

sfr CCAP2H = 0xFC; //PCA module-2 capture register HIGH

sfr CCAPM3 = 0xDD; //PCA module-3 mode register

sfr CCAP3L = 0xED; //PCA module-3 capture register LOW

sfr CCAP3H = 0xFD; //PCA module-3 capture register HIGH

sfr PCAPWM0 = 0xF2;

sfr PCAPWM1 = 0xF3;

sfr PCAPWM2 = 0xF4;

sfr PCAPWM3 = 0xF5;

void main()

{

CCON = 0; //Initial PCA control register

//PCA timer stop running

//Clear CF flag

//Clear all module interrupt flag

CL = 0; //Reset PCA base timer

CH = 0;

CMOD = 0x02; //Set PCA timer clock source as Fosc/2

//Disable PCA timer overflow interrupt

CCAP0H = CCAP0L = 0x80; //PWM0 port output 50% duty cycle square wave

CCAPM0 = 0x42; //PCA module-0 work in 8-bit PWM mode and no PCA interrupt

CCAP1H = CCAP1L = 0xff; //PWM1 port output 0% duty cycle square wave

PCAPWM1 = 0x03;

CCAPM1 = 0x42; //PCA module-1 work in 8-bit PWM mode and no PCA interrupt

CR = 1; //PCA timer start run

while (1);

}

#include <reg52h> //头文件

#define uchar unsigned char

#define uint unsigned int

sbit KEY1= P3^4; //定义按钮

sbit KEY2= P3^5; //定义按钮

sbit PWM= P1^7;//PWM输出的管脚定义

#define PERIOD 1000 //pwm周期

#define MIN_POSITIVE 100 //最小占空比100/1000

#define MAX_POSITIVE 900 //最大占空比900/1000

#define STEP 10 //步长

uint POSITIVE=MIN_POSITIVE;

void delay(uint i)//延时函数

{

while(--i);

}

void init_timer0()//设置定时器

{

TMOD=0X01;

TL0=(POSITIVE-PERIOD)%256;//具体怎么实现的你看一下51单片机定时器的东西,TLO,THO。

TH0=(POSITIVE-PERIOD)/256;

ET0=1;

}

void init_timer1() // 初始化定时器

{

TMOD|=0X10;

TL1=(0-POSITIVE)%256;

TH1=(0-POSITIVE)/256;

ET1=1;

EA=1;

}

void TIMER0_ISR(void)interrupt 1 //中断响应函数

{

TL0=(POSITIVE-PERIOD)%256;

TH0=(POSITIVE-PERIOD)/256;

TR0=0;

TR1=1;

PWM=0;

}

void TIMER1_ISR(void)interrupt 3 //中断响应函数

{

TL1=(0-POSITIVE)%256;

TH1=(0-POSITIVE)/256;

TR1=0;

TR0=1;

PWM=1;

}

void key_scan() 按钮扫描函数

{

uint step=0;

step=(PERIOD-MIN_POSITIVE-100)/STEP;

KEY1=1;

KEY2=1;

if(KEY1==0||KEY2==0)

{

delay(100);

if(KEY1==0)

{

POSITIVE+=step;

if(POSITIVE>MAX_POSITIVE)

POSITIVE=MAX_POSITIVE;

}

if(KEY2==0)

{

POSITIVE-=step;

if(POSITIVE<MIN_POSITIVE)

POSITIVE=MIN_POSITIVE;

}

while(KEY1==0||KEY2==0);

}

}

void main() //主函数

{

init_timer0();

init_timer1();

TR0=1;

while(1)key_scan();

}

//这里的意思就是高电平使用一个定时器,低电平使用一个定时器,其实可以使用一个定时器就可以完成这个任务。他的左右只是1ms响应一个中断,然后计数。

//

#include <REGX51H>

#define TIMER0_COUNT 0xFC18 //每秒中端1000次

unsigned long int m,a;

static void timer0_isr(void) interrupt 1 using 1

{

TR0=0;

TL0=(TIMER0_COUNT & 0x00FF);

TH0=(TIMER0_COUNT >> 8);

TR0=1;

m++;

}

static void timer0_initialize(void)

{

EA=0; / 设定系统不接受所有的中断 /

m=0;

TR0=0; / 关闭Timer0 /

TMOD =0x01; / 设定计时器0为16位的工作模式 /

TL0=(TIMER0_COUNT & 0x00FF); / 设定TL0的数值 /

TH0=(TIMER0_COUNT >> 8); / 设定TH0的数值 /

PT0=0; / 设定计时器0有比较高的优先级 /

ET0=1; / 设定接受Timer0的中断 /

TR0=1; / 启动Timer0 /

EA=1; / 设定系统接受中断 /

}

void main (void)

{

timer0_initialize();

P2_0=0;

P2_1=1;

P3_0=0;

P3_1=1;

a=25;

while(1)

{

if(m==a)

{

P2_2=0;

P3_2=0;

}

if(m==50)

{

P2_2=1;

P3_2=1;

m=0;

}

}

}

//

这是我之前写的程序,你看看吧。希望对你有帮助,这个好理解点

以上就是关于STM32F103求配置一个PWM输出的程序,要求如下全部的内容,包括:STM32F103求配置一个PWM输出的程序,要求如下、请教DSP28335输出类似下面的pwm波形程序,具体实现或者方法都可以、51单片机 用 串口控制 输出 PWM 波形 这程序为什么不行求高手指教。。等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9692042.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-05-01
下一篇2023-05-01

发表评论

登录后才能评论

评论列表(0条)

    保存