固定占空比PWM波形输出程序
STM32自定义频率与占空比PWM输出的方法

STM32自定义频率与占空比PWM输出的方法图一图二PWM应用非常广泛,但是不同的项目对输出的PWM又有特殊要求,为满足这些要求我们需要更多的实验来验证。
接下来讲述图一显示波形的输出方法步骤(图二为异常波形)。
一、本实例所使用资源:1、TIM4_CH3(对应管脚PB8)用于输出PWM波形2、TIM3用于产生中断3、MDK 软件仿真方法二、执行过程:1、初始化配置TIM4_CH3对应管脚的PWM输出功能(频率与占空比可变)。
2、初始化配置使用TIM3定时器中断功能,中断时间的配置需要根据PWM输出波形配置(定时器中断时间可变)。
3、在main()函数中调用TIM4与TIM3的初始化函数。
三、具体代码:int main(void) //主函数{undefineddelay_init(); //延时函数初始化uart_init(9600); //串口初始化TIM4_PWM_Init(999,7199); //TIM4 PWM输出初始化TIM3_Interrupt_Init(999,7199); //TIM3定时器中断初始化pwmval= 600; //占空比while(1) ;}void TIM4_PWM_Init(u16 arr,u16 psc) //TIM4 定时器PWM输出功能初始化函数{GPIO_InitTypeDef GPIO_InitStructure;TIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;TIM_OCInitTypeDef TIM_OCInitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM4, ENABLE);RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB | RCC_APB2Periph_AFIO, ENABLE);//使能GPIO外设和AFIO复用功能模块时钟使能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);TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值 80KTIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值不分频TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = T ck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM4, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_OCInitStructure.TIM_OCMode = TIM_OCMode_PWM1; //PWM模式2TIM_OCInitStructure.TIM_OutputState = TIM_OutputState_Enable; //正向通道有效TIM_OCInitStructure.TIM_OutputNState = TIM_OutputNState_Disable; //反向通道无效TIM_OCInitStructure.TIM_Pulse = 0; //占空时间// TIM_OC1Init(TIM4,&TIM_OCInitStructure); //通道1// TIM_OC1PreloadConfig(TIM4, TIM_OCPreload_Enable);// TIM_OC2Init(TIM4,&TIM_OCInitStructure); //通道2// TIM_OC2PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_OC3Init(TIM4, &TIM_OCInitStructure); //使能通道3TIM_OC3PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_OC4Init(TIM4, &TIM_OCInitStructure); //使能通道4TIM_OC4PreloadConfig(TIM4, TIM_OCPreload_Enable);TIM_CtrlPWMOutputs(TIM4,ENABLE);TIM_ARRPreloadConfig(TIM4, ENABLE); //使能TIMx在ARR上的预装载寄存器TIM_Cmd(TIM4, ENABLE); //使能TIMx外设}void TIM3_Interrupt_Init(u16 arr,u16 psc) //TIM3定时器中断功能初始化函数{undefinedTIM_TimeBaseInitTypeDef TIM_TimeBaseStructure;NVIC_InitTypeDef NVIC_InitStructure;RCC_APB1PeriphClockCmd(RCC_APB1Periph_TIM3, ENABLE); //时钟使能TIM_TimeBaseStructure.TIM_Period = arr; //设置在下一个更新事件装入活动的自动重装载寄存器周期的值计数到5000为500ms TIM_TimeBaseStructure.TIM_Prescaler =psc; //设置用来作为TIMx时钟频率除数的预分频值 10Khz的计数频率TIM_TimeBaseStructure.TIM_ClockDivision = 0; //设置时钟分割:TDTS = T ck_timTIM_TimeBaseStructure.TIM_CounterMode = TIM_CounterMode_Up; //TIM向上计数模式TIM_TimeBaseInit(TIM3, &TIM_TimeBaseStructure); //根据TIM_TimeBaseInitStruct中指定的参数初始化TIMx的时间基数单位TIM_ITConfig(TIM3,TIM_IT_Update | TIM_IT_Trigger,ENABLE);NVIC_InitStructure.NVIC_IRQChannel = TIM3_IRQn; //TIM3中断NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;//抢占优先级0级NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1; //相应优先级3级NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ 通道被使能NVIC_Init(&NVIC_InitStructure); //根据NVIC_InitStruct中指定的参数初始化外设NVIC寄存器TIM_Cmd(TIM3, ENABLE); //使能TIMx外设}void TIM3_IRQHandler(void) //TIM3中断服务函数{if(TIM_GetITStatus(TIM3, TIM_IT_Update) != RESET) //检查指定的TIM中断发生与否:TIM 中断源{undefined++Event;if(Event == 1){undefinedTIM_SetCompare3(TIM4,(led0pwmval*80)/100);}if(Event == 2){undefinedEvent = 0;TIM_SetCompare3(TIM4,(led0pwmval*20)/100);}TIM_ClearITPendingBit(TIM3, TIM_IT_Update); //清除TIMx的中断待处理位:TIM 中断源}}调试方法:PWM频率和占空比的修改最好是通过中断来实现,即用一个定时器定时产生中断,在中断服务函数中修改PWM输出频率与占空比。
如何利用51单片机输出PWM波

如何利用51单片机输出PWM波1、理论知识2、程序及分析1、理论知识PWM这个功能在飞思卡尔、STM32等高档的单片机内部有专用的模块,用此类芯片实现PWM功能时只需要通过设置相应的寄存器就可实现周期和占空比的控制。
但是如果要用51单片机的话,也是可以的,但是比较的麻烦。
此时需要用到内部定时器来实现,可用两个定时器实现,也可以用一个定时器实现。
用两个定时器的方法是用定时器T0来控制频率,定时器T1来控制占空比。
大致的的编程思路是这样的:T0定时器中断让一个I0口输出高电平,在这个定时器T0的中断当中起动定时器T1,而这个T1是让IO口输出低电平,这样改变定时器T0的初值就可以改变频率,改变定时器T1的初值就可以改变占空比。
下面重点介绍用一个定时器的实现PWM的方法。
因为市面上的智能小车所采用的电机大多数为TT减速电机,通过复杂的实验此电机最佳的工作频率为1000HZ(太高容易发生哨叫,太低电机容易发生抖动),所以下面以周期为1ms (1000HZ)进行举例,要产生其它频率的PWM波,程序中只需作简单修改即可。
用一个定时器时(如定时器T0),首先你要确定PWM的周期T和占空比D,确定了这些以后,你可以用定时器产生一个时间基准t,比如定时器溢出n次的时间是PWM的高电平的时间,则D*T=n*t,类似的可以求出PWM低电平时间需要多少个时间基准n'。
因为这里我们是产生周期为1ms(1000HZ)的PWM,所以可设置中断的时间基准为0.01ms,,然后中断100次即为1ms。
在中断子程序内,可设置一个变量如time,在中断子程序内,有三条重要的语句:1、当time>=100时,time清零(此语句保证频率为1000HZ),2、当time>n时(n应该在0-100之间变化开),让单片相应的I/O口输出高电平,当time<n时,让单片相应的I/O口输出低电平,此时占空比就为%n。
2、程序1,使单片机的I/O口输出固定频率的PWM波下面按上面的思路给出一个具体程序:/*******************************************************************/ /* 程序名:单片机输出固定频率的PWM波*//* 晶振:11.00592 MHz CPU型号:STC89C52 *//* 功能:P2^0口输出周期为1ms(1000HZ),占空比为%80的PWM波*//*****************************************************************/ #include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit PWM1=P2^0;//接IN1 控制正转sbit PWM2=P2^1;//接IN2 控制反转uchar time;void main(){TMOD=0x01;//定时器0工作方式1TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msEA=1;//开总中断ET0=1;//开定时器0中断TR0=1;//启动定时器0while(1){}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=500;y>0;y--);}void tim0() interrupt 1{TR0=0;//赋初值时,关闭定时器TH0=0xff;//(65536-10)/256;//赋初值定时TL0=0xf7;//(65536-10)%256;//0.01msTR0=1;//打开定时器time++;if(time>=100) time=0;//1khzif(time<=20) PWM1=0;//点空比%80else PWM1=1;PWM2=0;}程序说明:1、关于频率的确定:对于11.0592M晶振, PWM输出频率为1KHZ,此时设定时器0.01ms中断一次,时中断次数100次即为1KHZ( 0.01ms*100=1ms,即为1000HZ)此时,定时器计数器赋初值为TH0=FF,TL0=F7。
改变PWM输出波占空比程序

;本例通过编程,使CCP1模块工作在脉宽调制PWM方式下从RC2口上输出分辨率达10位的;PWM波形,波形的占空比可以通过键盘调节,当按下K1键时,输出的PWM波形的占空比为25%,;当按下K2键时,输出的PWM波形的占空比为50%,当按下K3键时,输出的PWM波形的占空;比为75%,当按下K4键时,输出的PWM波形的占空比为100% ,默认输出波形的占空比为50%;为了强调编程技巧,键盘程序采用变位中断方式LIST P=18F458INCLUDE "P18F458.INC"DEYH EQU 0X20DEYL EQU DEYH+1JIANR EQU DEYH+2 ;存储键值用寄存器ORG 0X00GOTO MAIN ;转向主程序ORG 0X08GOTO INTSERVE ;转向中断服务程序ORG 0X30;***************初始化子程序******************INITIALCLRF INTCON ;禁止总中断和外围中断BSF INTCON,RBIE ;B口变位中断允许BCF INTCON2,7 ;使弱上拉有效BSF INTCON2,1 ;B口变位中断高优先级BSF RCON,7 ;使能中断优先级MOVLW 0XFFMOVWF PR2 ;设置PWM的工作周期MOVLW 0X7FMOVWF CCPR1L ;默认占空比为50%MOVLW 0X3CMOVWF CCP1CON ;设置CCP1模块为PWM工作方式,且其工作循;环的低2位为11,高8位为01111111=7F MOVLW 0X04MOVWF T2CON ;打开TMR2,且使其前分频为1BCF TRISC,2 ;设置CCP1引脚为输出方式BCF TRISB,1BCF TRISA,3BCF TRISE,0BCF TRISE,1BSF TRISB,4 ;设置与键盘有关的各口的输入输出方式BCF PORTB,1BCF PORTA,3BCF PORTE,0BCF PORTE,1 ;K1,K2,K3,K4四条列线置0,为电平变化;中断的产生创造初始条件MOVF PORTB,W ;读PORTB端口,建立变位中断的初始条件;(由高到低时中断)RETURN;*********键盘去抖子程序(8ms的延时)******************KEYDELA YMOVLW 0X0AMOVWF DEYHAGAIN2 MOVLW 0XFFMOVWF DEYLAGAIN1 DECFSZ DEYL,1GOTO AGAIN1DECFSZ DEYH,1GOTO AGAIN2 ;具体程序语句参考3. 2节RETURN;***************键服务子程序******************KEYSERVEJIANZHI ;确定键值的子程序BCF PORTB,1BCF PORTA,3MOVLW 0X03MOVWF PORTE ;K1,K2置低电平,K3,K4置高电平NOPNOP ;使引脚电平稳定BTFSS PORTB,4GOTO K1K2 ;RB4为0,表示按键为K1,K2中的一个GOTO K3K4 ;RB4为1,表示按键为K3,K4中的一个K1K2 BCF PORTB,1BSF PORTA,3 ;K1置低电平,K2置高电平NOPNOP ;使引脚电平稳定BTFSS PORTB,4GOTO K1 ;RB4为0,表示按键为K1GOTO K2 ;RB4为1,表示按键为K2K3K4 BCF PORTE,0BSF PORTE,1 ;K3置低电平,K4置高电平NOPNOP ;使引脚电平稳定BTFSS PORTB,4GOTO K3 ;RB4为0,表示按键为K3GOTO K4 ;RB4为1,表示按键为K4,以上对键盘进行扫;描,来确定是哪一个键按下K1 MOVLW 0X01MOVWF JIANRGOTO RETK2 MOVLW 0X02MOVWF JIANRBCF PORTA,3GOTO RETK3 MOVLW 0X03MOVWF JIANRGOTO RETK4 MOVLW 0X04MOVWF JIANR ;以上根据按下的键把相应的值送给JIANRBCF PORTE,1RET NOPRETURN;**********确定占空比为25%的子程序*********PER25 MOVLW 0X3FMOVWF CCPR1LRETURN;**********确定占空比为50%的子程序*********PER50 MOVLW 0X7FMOVWF CCPR1LRETURN;**********确定占空比为75%的子程序*********PER75 MOVLW 0XBFMOVWF CCPR1LRETURN;**********确定占空比为100%的子程序*********PER100 MOVLW 0XFFMOVWF CCPR1LRETURN;**************中断服务子程序***************INTSERVE NOPBCF INTCON,RBIF ;清除中断标志CALL KEYDELA Y ;调用软件延时子程序消抖动MOVF PORTB,W ;读PORTB的值,并同时改变中断发生的条件可;以屏蔽一次无用的中断,又可以防止按键时间;过长发生连续中断BTFSC PORTB,4RETFIE ;判断为干扰,则返回,并可以屏蔽一次无用的;中断CALL KEYSERVE ;调用键服务子程序,确定键值BCF PORTB,1BCF PORTA,3BCF PORTE,0BCF PORTE,1 ;送低电平至K1,K2,K3,K4,以防止键扫描;时改变K1,K2,K3,K4的电平,从而改变中;断条件BCF INTCON,RBIF ;键扫描时可能会产生"电平变化"而使RBIF;置1,再清除一次RBIF以求避免额外中断MOVLW 0X01 ;以下通过判断是哪个键按下从SUBWF JIANR,0 ;而选择PWM波形的不同占空比BTFSC STA TUS,ZCALL PER25 ;若是K1按下,则PWM占空比为25%;以下同理MOVLW 0X02SUBWF JIANR,0BTFSC STA TUS,ZCALL PER50MOVLW 0X03SUBWF JIANR,0BTFSC STA TUS,ZCALL PER75MOVLW 0X04SUBWF JIANR,0BTFSC STA TUS,ZCALL PER100RETFIE ;中断返回;****************************************MAIN NOPCALL INITIAL ;初始化BSF INTCON,GIE ;总中断允许HERE GOTO HERE ;等待中断END。
stm32输出pwm占空比代码

stm32输出pwm占空比代码在STM32单片机中,输出PWM(脉冲宽度调制)信号是非常普遍的操作,这种信号通常用于控制电机、LED灯等电子设备的亮度或运动状态。
本文将详细介绍STM32单片机如何输出PWM占空比代码。
一、配置TIM定时器要输出PWM信号,首先需要进行TIM定时器的配置。
在KEIL C 编译器中,可以通过CubeMX插件进行配置。
在此之前需要先引入库文件“stm32fxx_hal_tim.h”。
在CubeMX中选择对应的TIM,进入“Mode”选项卡,将TIM定时器配置为PWM输出模式。
在“Configuration”选项卡中,配置TIM的时钟源和预分频系数等信息。
此外还需要配置PWM的周期和占空比,具体可以通过下面的步骤实现。
二、设置PWM周期在代码中设置PWM周期,可以使用HAL库中的“__HAL_TIM_SET_AUTORELOAD”函数。
该函数的第一个参数为TIM定时器的句柄,第二个参数为PWM的周期,单位为计数器的值。
可以根据需要调整该值来改变PWM的输出频率。
例如,将PWM周期设置为1000,代码如下:__HAL_TIM_SET_AUTORELOAD(&htim1, 1000);三、设置PWM占空比在代码中设置PWM占空比,需要使用HAL库中的“__HAL_TIM_SET_COMPARE”函数。
该函数的第一个参数是TIM定时器的句柄,第二个参数是设置输出PWM的通道,第三个参数是占空比。
占空比的取值范围为0到PWM周期。
例如,将PWM占空比设置为500,代码如下:__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 500);四、使用PWM输出信号最后,在代码中使用PWM输出信号,可以使用HAL库中的“HAL_TIM_PWM_Start”函数。
该函数的参数为TIM的句柄和输出PWM 的通道。
例如,在TIM1通道1上启动PWM输出,代码如下:HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);以上就是STM32单片机输出PWM占空比代码的详细步骤。
STM32Cubemx输出可调频率与占空比的PWM

STM32Cubemx输出可调频率与占空⽐的PWM 这⾥就不对STM32的PWM进⾏讲解了,想要了解的可以百度⼀下,这⾥主要说怎么实现。
1、建⽴⼯程,我选的是STM32F103zet6芯⽚,选择定时器的PWM功能 2、配置时钟,我这⾥配的是内部时钟,没有配外部时钟,⽽且不是最⼤时钟,有需要的可以⾃⼰改 3、配置定时器,这⾥的话默认就可以,因为代码⾥⾯需要对配置的初始化代码进⾏修改的,⽽修改后才可以实现该功能 4、⽣成代码后,修改代码,找到PWM初始化函数,修改为如下代码,注意要把初始化函数前⾯的static关键字也去掉,⽽且函数声明也要跟着修改void MX_TIM4_Init(uint16_t pre,uint16_t pul) //修改初始化函数,改变频率与PWM{//占空⽐=Pulse/Period;频率:f=48M/pre/perTIM_MasterConfigTypeDef sMasterConfig;TIM_OC_InitTypeDef sConfigOC;htim4.Instance = TIM4;htim4.Init.Prescaler =pre; //分频(关键)htim4.Init.Period = 100-1;//计数周期(关键,若100的计数周期对于⼀些频率跟占空⽐误差⼤的话,可以⾃⼰计算更改调试计数周期⼤⼩)htim4.Init.CounterMode = TIM_COUNTERMODE_UP;htim4.Init.ClockDivision = TIM_CLOCKDIVISION_DIV1;htim4.Init.AutoReloadPreload = TIM_AUTORELOAD_PRELOAD_DISABLE;if (HAL_TIM_PWM_Init(&htim4) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sMasterConfig.MasterOutputTrigger = TIM_TRGO_RESET;sMasterConfig.MasterSlaveMode = TIM_MASTERSLAVEMODE_DISABLE;if (HAL_TIMEx_MasterConfigSynchronization(&htim4, &sMasterConfig) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}sConfigOC.OCMode = TIM_OCMODE_PWM1;sConfigOC.Pulse = pul;//脉冲计数(关键)sConfigOC.OCPolarity = TIM_OCPOLARITY_HIGH;sConfigOC.OCFastMode = TIM_OCFAST_DISABLE;if (HAL_TIM_PWM_ConfigChannel(&htim4, &sConfigOC, TIM_CHANNEL_1) != HAL_OK){_Error_Handler(__FILE__, __LINE__);}HAL_TIM_MspPostInit(&htim4);} 5、接着在⾃⼰需要的代码⾥插⼊,PWM开始停⽌函数就可以啦HAL_TIM_PWM_Start(&htim4, TIM_CHANNEL_1); //PWM开启函数MX_TIM4_Init(uint16_t pre,uint16_t pul);//改变参数就可实现改变占空⽐跟频率的⽬的了HAL_TIM_PWM_Stop(&htim4, TIM_CHANNEL_1);//停⽌PWM 这⾥我说⼀下核⼼部分:占空⽐ = (Pulse/Period)*100%;频率: f = 48M/Prescaler/Period;影响PWM占空⽐跟频率的参数这主要是 Pulse、Prescaler、Period这3个;频率跟占空⽐都与Period(计数周期)有关,只要我们把计数周期定下来,修改Prescaler、跟Pulse 这两个值,就可以直接修改PWM的频率跟占空⽐了。
pwm占空比程序c语言程序

pwm占空比程序c语言程序Pulse Width Modulation (PWM) is a crucial concept in electronicsand can be implemented using a C language program. PWM is a method of controlling the amount of power delivered to an electronic device by varying the ON time and OFF time of a digital signal. This is achieved by changing the duty cycle of the signal, which is the ratio of ON time to the total time of one cycle. In a simple PWM circuit, the duty cycle determines the average voltage applied to the load, allowing for precise control of devices like motors, LEDs, and heaters.在电子学中,脉冲宽度调制(PWM)是一个至关重要的概念,可以通过使用C语言程序来实现。
PWM是一种控制向电子设备传送的功率量的方法,方法是通过改变数字信号的开启时间和关闭时间。
这是通过改变信号的占空比来实现的,占空比是开启时间与一个周期总时间的比例。
在一个简单的PWM电路中,占空比决定了施加到负载上的平均电压,从而实现对电机、LED和加热器等设备的精确控制。
Implementing a PWM program in C language involves using timer modules and I/O pins on a microcontroller. The timer is used togenerate a periodic signal, which is then modulated to create the desired PWM waveform. By manipulating the timer settings, such as the prescaler and period, the frequency and duty cycle of the PWM signal can be adjusted. The duty cycle is usually expressed as a percentage, with 0% representing a fully OFF signal and 100% representing a fully ON signal. This flexibility allows for customization of the PWM output to match the requirements of specific applications.在C语言中实现PWM程序涉及使用微控制器上的定时器模块和I/O引脚。
Pwm程序流程图

}
//--—-——--—--—--——----—----—---——----————-—— void time0() interrupt 1
{
TL0 = (65536—50000) % 256;
TH0 = (65536-50000) / 256; //50ms@12MHz
a++;
if(a == 20) a = 0;
KEY1: MOV C,P2。1 JC KEY2 LJMP PKEY1(停止)
KEY2: MOV C,P2。2 JC KEY3 LJMP PKEY2(正转)
KEY3: MOV C,P2。3 反转 ..。..。。 。。....。 KEY5: MOV C,P2.5
JC RETURN LJMP PKEY5(减速)
TH0=V_TH0; /*恢复定时器初始值*/ TL0=V_TL0; ++click; if (click>=100) click=0; if (click〈=ZKB1) /*当小于占空比值时输出低电平,高于时是高电平,从而实现占空比 的调整*/ P2=0xff; else P2=0x00; }
正反转
while(p1.1) do{p0.2=1;p0。3=1; } while(p1.1;p1.2) do{p0。3=1;p0.4=1; } while(p1.0)
do{p0。0=1;p0。1=1; } while(p1。0;p1.2) do{p0。0=1;p0.5=1; } while(p1.0;p1。1)
电路以及仿真效果如下图:
用 16 产生了 10K,50%占空比的 PWM 波,但是用按键无法控制 PWM 的占空比 #include〈iom16v.h〉
#include<macros.h〉 #define uchar unsigned char #define uint unsigned int int num=50;
输出占空比可变的PWM波形

DSP原理及应用大作业输出占空比可变的PWM波形输出占空比可变的PWM波形任务目的1. 掌握CCS集成开发环境的调试方法;2. 掌握C/C++语言与汇编混合编程;3. 熟悉CCS集成开发环境,掌握工程的生成方法;4. 掌握如何输出占空比可变的PWM波形5. 了解PWM波形产生的原理和应用任务内容1. 通过学习课本和查询课外资料了解空间矢量PWM产生的原理;2. 利用CCS集成开发环境,建立工程,完成DSP汇编源文件的建立和编写,实现对称空间矢量PWM波形生成,在该程序中,利用定时器1ms中断来实现每隔1s改变1次CMPR1;3. 编译并且在片外区通过连接示波器运行得出正确结果,利用示波器观察波形任务原理1.PWM的原理脉宽调制(PWM)基本原理:控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。
也就是在输出波形的半个周期中产生多个脉冲,使各脉冲的等值电压为正弦波形,所获得的输出平滑且低次谐波少。
按一定的规则对各脉冲的宽度进行调制,即可改变逆变电路输出电压的大小,也可改变输出频率。
例如,把正弦半波波形分成N等份,就可把正弦半波看成由N个彼此相连的脉冲所组成的波形。
这些脉冲宽度相等,都等于∏/n ,但幅值不等,且脉冲顶部不是水平直线,而是曲线,各脉冲的幅值按正弦规律变化。
如果把上述脉冲序列用同样数量的等幅而不等宽的矩形脉冲序列代替,使矩形脉冲的中点和相应正弦等分的中点重合,且使矩形脉冲和相应正弦部分面积(即冲量)相等,就得到一组脉冲序列,这就是PWM波形。
可以看出,各脉冲宽度是按正弦规律变化的。
根据冲量相等效果相同的原理,PWM波形和正弦半波是等效的。
对于正弦的负半周,也可以用同样的方法得到PWM波形。
在PWM波形中,各脉冲的幅值是相等的,要改变等效输出正弦波的幅值时,只要按同一比例系数改变各脉冲的宽度即可,因此在交-直-交变频器中,PWM 逆变电路输出的脉冲电压就是直流侧电压的幅值。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
DevEmuRegs.H0RAMDFT = 0x0300;
SysCtrlRegs.WDCR= 0x0068;
SysCtrlRegs.PLLCR = 0xA;
for(i= 0; i< 5000; i++){}
SysCtrlRegs.HISPCP.all = 0x0001;
GpioMuxRegs.GPAMUX.bit.PWM1_GPIOA0=1;
GpioMuxRegs.GPAMUX.bit.PWM2_GPIOA1=1; GpioMuxRegs.GPAMUX.bit.PWM3_GPIOA2=1;
GpioMuxRegs.GPAMUX.bit.PWM4_GPIOA3=1; GpioMuxRegs.GPAMUX.bit.PWM5_GPIOA4=1; GpioMuxRegs.GPBMUX.bit.T3PWM_GPIOB6=1;
{
InitSysCtrl();
DINT;
IER = 0x0000;
IFR = 0x0000;
InitPieCtrl();
InitPieVectTable();
InitGpio();
InitEv();
EvaRegs.T1CON.bit.TENABLE=1; EvaRegs.T2CON.bit.TENABLE=1;
GpioMuxRegs.GPBMUX.bit.T4PWM_GPIOB7=1;
GpioMuxRegs.GPBMUX.bit.PWM7_GPIOB0=1;
GpioMuxRegs.GPBMUX.bit.PWM8_GPIOB1=1;
GpioMuxRegs.GPBMUX.bit.PWM9_GPIOB2=1;
GpioMuxRegs.GPBMUX.bit.PWM10_GPIOB3=1;
SysCtrlRegs.LOSPCP.all = 0x0002;
SysCtrlRegs.PCLKCR.bit.EVAENCLK=1;
SysCtrlRegs.PCLKCR.bit.EVBENCLK=1;
EDIS;
}
void KickDog(void)
{
EALLOW;
SysCtrlRegs.WDKEY = 0x0055;
EvaRegs.DBTCONA.bit.DBT=10; EvaRegs.DBTCONA.bit.EDBT1=1; EvaRegs.DBTCONA.bit.EDBT2=1; EvaRegs.DBTCONA.bit.EDBT3=1; EvaRegs.DBTCONA.bit.DBTPS=4,
EvaRegs.ACTR.all=0x0999;
EvaRegs.T2CON.bit.TMODE=1; EvaRegs.T2CON.bit.TPS=1; EvaRegs.T2CON.bit.TENABLE=0; EvaRegs.T2CON.bit.TCLKS10=0; EvaRegs.T2CON.bit.TECMPR=1;
EvaRegs.GPTCONA.bit.TCOMPOE=1; EvaRegs.GPTCONA.bit.T1PIN=1; EvaRegs.GPTCONA.bit.T2PIN=2;
SysCtrlRegs.WDKEY = 0x00AA;
EDIS;
}
程序二:Gpio口初始化
#include "DSP28_Device.h"
void InitGpio(void)
{
EALLOW GpioMuxRegs.GPAMUX.bit.T1PWM_GPIOA6=1;
GpioMuxRegs.GPAMUX.bit.T2PWM_GPIOA7=1;
EvaRegs.CMPR1=7499; EvaRegs.CMPR2=7499; EvaRegs.CMPR3=7499;
EvbRegs.T3CON.bit.TMODE=1; EvbRegs.T3CON.bit.TPS=1; EvbRegs.T3CON.bit.TENABLE=0; EvbRegs.T3CON.bit.TCLKS10=0; EvbRegs.T3CON.bit.TECMPR=1;
EvaRegs.T1PR=7499; EvaRegs.T1CMPR=3750; EvaRegs.T1CNT=0;
EvaRegs.T2PR=7499; EvaRegs.T2CMPR=3750; EvaRegs.T2CNT=0;
CONA.bit.CENABLE=1; CONA.bit.FCOMPOE=1; CONA.bit.CLD=2;
GpioMuxRegs.GPBMUX.bit.PWM11_GPIOB4=1;
GpioMuxRegs.GPBMUX.bit.PWM12_GPIOB5=1;
EDIS;
}
程序四:主程序
#include "DSP28_Device.h"
#include "DSP28_Globalprototypes.h"
void main(void)
#include "DSP28_Device.h"
void InitEv(void)
{
EvaRegs.T1CON.bit.TMODE=1; EvaRegs.T1CON.bit.TPS=1;
EvaRegs.T1CON.bit.TENABLE=0; EvaRegs.T1CON.bit.TCLKS10=0; EvaRegs.T1CON.bit.TECMPR=1;
程序一:系统初试化程序
#include "DSP28_Device.h"
void InitSysCtrl(void)
{
Uint16 i;
EALLOW;
DevEmuRegs.M0RAMDFT = 0x0300;
DevEmuRegs.M1RAMDFT = 0x0300;
DevEmuRegs.L0RAMDFT = 0x0300;
EvbRegs.T3CON.bit.TENABLE=1; EvbRegs.T4CON.bit.TENABLE=1;
while(1){ }
}
程序说明
本程序实现的是在PWM1,PWM3,PWM5三个口输出占空比为50%,频率为5KHZ的对称方波。本程序参照书上固定占空比PWM波形产生程序改写而成。
程序三:EV初始化