电子谱曲.docx
- 文档编号:24165538
- 上传时间:2023-05-24
- 格式:DOCX
- 页数:22
- 大小:156.29KB
电子谱曲.docx
《电子谱曲.docx》由会员分享,可在线阅读,更多相关《电子谱曲.docx(22页珍藏版)》请在冰豆网上搜索。
电子谱曲
西南科技大学
专业方向设计报告
课程名称:
嵌入式方向设计
设计名称:
电子谱曲
姓名:
宋思洋
学号:
20075114
班级:
自动0705
指导教师:
张海涛老师
西南科技大学信息工程学院制
1.设计题目:
电子谱曲
通过按键进行谱曲,并将谱曲结果存入到FLASH中,并能播放所谱歌曲、
2、设计思路:
通过ARM7中的数组对PWM的不同频率波形的识别,释放高低电平,再通过简易功放装置进行输出播放
PWM脉宽调制,是靠改变脉冲宽度来控制输出电压,通过改变周期来控制其输出频率。
而输出频率的变化可通过改变此脉冲的调制周期来实现。
这样,使调压和调频两个作用配合一致,且于中间直流环节无关,因而加快了调节速度,改善了动态性能。
由于输出等幅脉冲只需恒定直流电源供电,可用不可控整流器取代相控整流器,使电网侧的功率因数大大改善。
利用PWM逆变器能够抑制或消除低次谐波。
加上使用自关断器件,开关频率大幅度提高,输出波形可以非常接近正弦波。
PWM变频电路具有以下特点:
1.可以得到相当接近正弦波的输出电压
2.整流电路采用二极管,可获得接近1的功率因数
3.电路结构简单
4.通过对输出脉冲宽度的控制可改变输出电压,加快了变频过程的动态响应现在通用变频器基本都再用PWM控制方式。
控制方式就是对逆变电路开关器件的通断进行控制,使输出端得到一系列幅值相等的脉冲,用这些脉冲来代替正弦波或所需要的波形。
根据冲量相等效果相同的原理,PWM波形和正弦半波是等效的。
对于正弦的负半周,也可以用同样的方法得到PWM波形。
在PWM波形中,各脉冲的幅值是相等的,要改变等效输出正弦波的幅值时,只要按同一比例系数改变各脉冲的宽度即可,因此在交-直-交变频器中,整流电路采用不可控的二极管电路即可,PWM逆变电路输出的脉冲电压就是直流侧电压的幅值。
根据上述原理,在给出了正弦波频率,幅值和半个周期内的脉冲数后,PWM波形各脉冲的宽度和间隔就可以准确计算出来。
按照计算结果控制电路中各开关器件的通断,就可以得到所需要的PWM波形
Flash存储设计:
芯片内部存储器flash操作函数,对芯片内部flash进行操作的函数,包括读取,状态,擦除,写入等等,可以允许程序去操作flash上的数据。
基础应用1,FLASH时序延迟几个周期,等待总线同步操作。
推荐按照单片机系统运行频率,0—24MHz时,取Latency=0;24—48MHz时,取Latency=1;48~72MHz时,取Latency=2。
所有程序中必须的
用法:
FLASH_SetLatency(FLASH_Latency_2);
位置:
RCC初始化子函数里面,时钟起振之后。
基础应用2,开启FLASH预读缓冲功能,加速FLASH的读取。
所有程序中必须的
用法:
FLASH_PrefetchBufferCmd(FLASH_PrefetchBuffer_Enable);
位置:
RCC初始化子函数里面,时钟起振之后。
硬件设计:
端口PA8作为控制端口连接驱动电路驱动扬声器
通过定时器产生不同频率的PWM波实现不同的音调,由音调的组合依次调用实现乐曲的播放
采用扫描方式来读取按键值,并在按下按键时调用发音函数实现发音
软件编译环境:
RVMDK
硬件是在STM32(32位的单片机,ARM7的一种)上实现
软件设计:
/*Includes------------------------------------------------------------------*/
#include"stm32f10x.h"
#include"stm32f10x_tim.h"
#include"stm32f10x_rcc.h"
#include"stm32f10x_flash.h"
#include"stm32f10x_gpio.h"
#include"misc.h"
/*Privatetypedef-----------------------------------------------------------*/
/*Privatedefine------------------------------------------------------------*/
/*Privatemacro-------------------------------------------------------------*/
/*Privatevariables---------------------------------------------------------*/
TIM_TimeBaseInitTypeDefTIM1_TimeBaseStructure;
TIM_OCInitTypeDefTIM1_OCInitStructure;
TIM_BDTRInitTypeDefTIM1_BDTRInitStructure;
u16capture=0;
u16CCR1_Val=0xAFFF;
u16CCR2_Val=0x3FFF;
u16CCR3_Val=0x1FFF;
ErrorStatusHSEStartUpStatus;
GPIO_InitTypeDefGPIO_InitStructure;
staticunsignedcharnum=0;
staticunsignedchark_flag=0;
/*Privatefunctionprototypes-----------------------------------------------*/
voidRCC_Configuration(void);
voidGPIO_Configuration(void);
voidNVIC_Configuration(void);
voidDelay(u16time);
voidInit_Time1(u16yind,u16time);
unsignedcharnumm(void);
voidDelay_M(__IOuint32_tnCount);
voidInit_Time2(u16yind,u16time);
/*Privatefunctions---------------------------------------------------------*/
/*******************************************************************************
*FunctionName:
main
*Description:
Mainprogram
*Input:
None
*Output:
None
*Return:
None
*******************************************************************************/
intmain(void)
{
staticu16yindiao[9]={0xD510,0xBDC5,0xA938,0x9fb4,0x8e41,0x7eaf,0x70cf,0x0000,0x0000};
staticu8gequ[]={3,3,4,5,8,5,4,3,2,8,1,1,2,3,8,3,9,2,2,8,3,3,4,5,8,5,4,3,2,8,1,1,2,3,8,2,9,1,1,8,2,2,3,1,
8,2,33,44,33,11,8,2,33,44,33,22,8,1,2,55,3,8,3,3,4,5,8,55,44,33,44,2,8,1,1,2,3,8,2,9,1,8,8,8,8,8,8,8};
u16temp=0,ReadValue=0;
#ifdefDEBUG
debug();
#endif
/*SystemClocksConfiguration*/
RCC_Configuration();
/*GPIOConfiguration*/
GPIO_Configuration();
/*NVICconfiguration*/
NVIC_Configuration()
/*-----------------------------------------------------------------------
TIM1Configurationto:
1/Generate3complementaryPWMsignalswith3differentdutycycles:
TIM1CLK=72MHz,Prescaler=0x0,TIM1counterclock=72MHz
TIM1frequency=TIM1CLK/(TIM1_Period+1)=1.098KHz
TIM1Channel1dutycycle=TIM1->CCR1/TIM1_Period=50%
TIM1Channel1Ndutycycle=(TIM1_Period-TIM1_CCR1)/(TIM1_Period+1)=50%
TIM1Channel2dutycycle=TIM1_CCR2/TIM1_Period=25%
TIM1Channel2Ndutycycle=(TIM1_Period-TIM1_CCR1)/(TIM1_Period+1)=75%
TIM1Channel3dutycycle=TIM1_CCR3/TIM1_Period=12.5%
TIM1Channel3Ndutycycle=(TIM1_Period-TIM1_CCR3)/(TIM1_Period+1)=87.5%
2/Insertadeadtimeequalto1.62us
3/Configurethebreakfeature,activeatHighlevel,andusingtheautomatic
outputenablefeature
4/UsetheLockingparametreslevel1.
-----------------------------------------------------------------------*/
/*TIM1PeripheralConfiguration*/
TIM_DeInit(TIM1);
/*TimeBaseconfiguration*/
TIM1_TimeBaseStructure.TIM_Prescaler=0x0;
TIM1_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM1_TimeBaseStructure.TIM_Period=0xFFFF;
TIM1_TimeBaseStructure.TIM_ClockDivision=0x0;
TIM1_TimeBaseStructure.TIM_RepetitionCounter=0x0;
TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);
/*Channel1,2,3and4ConfigurationinPWMmode*/
TIM1_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
TIM1_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM1_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
TIM1_OCInitStructure.TIM_Pulse=CCR2_Val;
TIM1_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM1_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
TIM1_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM1_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
TIM1_OCInitStructure.TIM_Pulse=CCR2_Val;
TIM_OC2Init(TIM1,&TIM1_OCInitStructure);
TIM1_OCInitStructure.TIM_Pulse=CCR3_Val;
TIM_OC3Init(TIM1,&TIM1_OCInitStructure);
/*AutomaticOutputenable,Break,deadtimeandlockconfiguration*/
TIM1_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Enable;
TIM1_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Enable;
TIM1_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_1;
TIM1_BDTRInitStructure.TIM_DeadTime=0x75;
TIM1_BDTRInitStructure.TIM_Break=TIM_Break_Enable;
TIM1_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;
TIM1_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable;
TIM_BDTRConfig(TIM1,&TIM1_BDTRInitStructure);
/*TIM1counterenable*/
TIM_Cmd(TIM1,ENABLE);
/*MainOutputEnable*/
TIM_CtrlPWMOutputs(TIM1,ENABLE);
while
(1)
{
for(temp=0;temp<88;temp++)
{
switch(gequ[temp])
{
case1:
Init_Time1(yindiao[0],0x30);break;
case2:
Init_Time1(yindiao[1],0x30);break;
case3:
Init_Time1(yindiao[2],0x30);break;
case4:
Init_Time1(yindiao[3],0x30);break;
case5:
Init_Time1(yindiao[4],0x30);break;
case6:
Init_Time1(yindiao[5],0x30);break;
case7:
Init_Time1(yindiao[6],0x30);break;
case8:
Init_Time2(yindiao[7],0x3);break;
case9:
Init_Time2(yindiao[8],0x1);break;
case11:
Init_Time1(yindiao[0],0x19);break;
case22:
Init_Time1(yindiao[1],0x19);break;
case33:
Init_Time1(yindiao[2],0x19);break;
case44:
Init_Time1(yindiao[3],0x19);break;
case55:
Init_Time1(yindiao[4],0x19);break;
case66:
Init_Time1(yindiao[5],0x19);break;
case77:
Init_Time1(yindiao[6],0x19);break;
default:
break;
}
//Init_Time2(yindiao[7],0x30);
GPIO_SetBits(GPIOB,GPIO_Pin_5);
/*numm();
if(num==1)
{
GPIO_SetBits(GPIOB,GPIO_Pin_5);
//Delay(0x4f);
}
elseif(num==2)
{
GPIO_SetBits(GPIOD,GPIO_Pin_6);
}
elseif(num==3)
{
GPIO_SetBits(GPIOD,GPIO_Pin_3);
}
else
{
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
GPIO_ResetBits(GPIOD,GPIO_Pin_6|GPIO_Pin_3);
}
Delay(0x2f);
GPIO_ResetBits(GPIOB,GPIO_Pin_5);
Delay(0x2f);*/
}
}
}
voidInit_Time2(u16yind,u16time)
{
/*TIM1PeripheralConfiguration*/
TIM_DeInit(TIM1);
TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
Delay(time);
}
voidInit_Time1(u16yind,u16time)
{
/*TIM1PeripheralConfiguration*/
TIM_DeInit(TIM1);
/*TimeBaseconfiguration*/
TIM1_TimeBaseStructure.TIM_Prescaler=0x2;
TIM1_TimeBaseStructure.TIM_CounterMode=TIM_CounterMode_Up;
TIM1_TimeBaseStructure.TIM_Period=yind;
TIM1_TimeBaseStructure.TIM_ClockDivision=0x0;
TIM1_TimeBaseStructure.TIM_RepetitionCounter=0x0;
TIM_TimeBaseInit(TIM1,&TIM1_TimeBaseStructure);
/*Channel1,2,3and4ConfigurationinPWMmode*/
TIM1_OCInitStructure.TIM_OCMode=TIM_OCMode_PWM2;
TIM1_OCInitStructure.TIM_OutputState=TIM_OutputState_Enable;
TIM1_OCInitStructure.TIM_OutputNState=TIM_OutputNState_Enable;
TIM1_OCInitStructure.TIM_Pulse=CCR2_Val;
TIM1_OCInitStructure.TIM_OCPolarity=TIM_OCPolarity_Low;
TIM1_OCInitStructure.TIM_OCNPolarity=TIM_OCNPolarity_Low;
TIM1_OCInitStructure.TIM_OCIdleState=TIM_OCIdleState_Set;
TIM1_OCInitStructure.TIM_OCNIdleState=TIM_OCIdleState_Reset;
TIM_OC1Init(TIM1,&TIM1_OCInitStructure);
TIM1_OCInitStructure.TIM_Pulse=CCR2_Val;
TIM_OC2Init(TIM1,&TIM1_OCInitStructure);
TIM1_OCInitStructure.TIM_Pulse=CCR3_Val;
TIM_OC3Init(TIM1,&TIM1_OCInitStructure);
/*AutomaticOutputenable,Break,deadtimeandlockconfiguration*/
TIM1_BDTRInitStructure.TIM_OSSRState=TIM_OSSRState_Enable;
TIM1_BDTRInitStructure.TIM_OSSIState=TIM_OSSIState_Enable;
TIM1_BDTRInitStructure.TIM_LOCKLevel=TIM_LOCKLevel_1;
TIM1_BDTRInitStructure.TIM_DeadTime=0x75;
TIM1_BDTRInitStructure.TIM_Break=TIM_Break_Enable;
TIM1_BDTRInitStructure.TIM_BreakPolarity=TIM_BreakPolarity_High;
TIM1_BDTRInitStructure.TIM_AutomaticOutput=TIM_AutomaticOutput_Enable
TIM_BDTRConfig(TIM1,&TIM1_BDTRInitStructure);
/*TIM1counterenable*/
TIM_Cmd(TIM1,ENABLE);
/*MainOutputEnable*/
TIM_CtrlPWMOutputs(TIM1,ENABLE);
Delay(time)
}
voidDelay(u16time)
{
u32i=0;
while(time--)
{
for(i=0;i<0xffff;i++);
}
}
//++++++++++++键盘处理++++++++++++++++++++++++++
unsignedcharnumm(void){
u16ReadValue;
u8hang=0;
GPIO_Init
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 电子 谱曲