飞思卡尔单片机mc9s12dg128的pwm参考程序
飞思卡尔16位单片机9S12XS128使用和程序
![飞思卡尔16位单片机9S12XS128使用和程序](https://img.taocdn.com/s3/m/5f3c9996aa00b52acec7ca41.png)
飞思卡尔16位单片机9S12XS128使用收藏最近做一个关于飞思卡尔16位单片机9S12XS128MAA的项目,以前未做过单片机,故做此项目颇有些感触。
现记录下这个艰辛历程。
以前一直是做软件方面的工作,很少接触硬件,感觉搞硬件的人很高深,现在接触了点硬件发现,与其说使用java,C#等语言写程序是搭积木,不如说搞硬件芯片搭接的更像是在搭积木(因为芯片是实实在在拿在手里的东西,而代码不是滴。
还有搞芯片内部电路的不在此列,这个我暂时还不熟悉)。
目前我们在做的这个模块,就是使用现有的很多芯片,然后根据其引脚定义,搭接出我们需要的功能PCB板,然后为其写程序。
废话不多说,进入正题。
单片机简介:9S12XS128MAA单片机是16位的单片机80个引脚,CPU是CPU12X,内部RAM 8KB,EEPROM:2KB,FLASH:128KB,外部晶振16M,通过内部PLL可得40M总线时钟。
9S12XS128MAA单片机拥有:CAN:1个,SCI:2个,SPI:1个,TIM:8个,PIT:4个,A/D:8个,PWM:8个下面介绍下我们项目用到的几个模块给出初始化代码1、时钟模块初始化单片机利用外部16M晶振,通过锁相环电路产生40M的总线时钟(9S12XS128系列标准为40M),初始化代码如下:view plaincopy to clipboardprint?/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}/******************系统时钟初始化****************/void Init_System_Clock(){asm { // 这里采用汇编代码来产生40M的总线LDAB #3STAB REFDVLDAB #4STAB SYNRBRCLR CRGFLG,#$08,*//本句话含义为等待频率稳定然后执行下一条汇编语句,选择此频率作为总线频率BSET CLKSEL,#$80}}上面的代码是汇编写的,这个因为汇编代码量比较少,所以用它写了,具体含义注释已经给出,主函数中调用此函数即可完成时钟初始化,总线时钟为40M.2、SCI模块初始化单片机电路做好了当然少不了和PC之间的通信,通信通过单片机串口SCI链接到PC 端的COM口上去。
MC9S12XS128之脉冲宽度调制PWM
![MC9S12XS128之脉冲宽度调制PWM](https://img.taocdn.com/s3/m/82c39a0084254b35effd349a.png)
M C9S12X S128之脉冲宽度调制P W M-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN半年前就开始写PWM的程序了,那时候只是用来控制电机和舵机。
最近在烦着摄像头的显示问题,再次探究PWM,看能不能找到出路。
我数了一下,整个PWM模块中,总共有37个寄存器。
不过把这些寄存器的功能都理了一下,发现:也不过这么一回事。
PWM就是脉冲宽度调制,是英文“Pulse Width Modulation”的缩写,是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术。
在XS128中,PWM主要就是通过设置相关的寄存器,让PWM0~PWM7引脚输出一定周期一定占空比的矩形波。
输出的矩形波的周期和占空比在输出的过程中,可以通过改变相关寄存器的值来改变的。
电机和舵机就这利用这点来控制期速度和转向的。
不过观察了一下,似乎在112引脚封装的芯片中才有PWM0到PWM7八个通道的引脚输出,而在80引脚封装的芯片中只有七个通道的引脚输出,没有PWM6的引脚输出。
接下来写一下各个寄存器的功能和设置方法:一、PWME:各通道使能寄存器明显,当某位置1时,相应通道的PWM就打开了。
置0时,就是禁止该通道的PWM。
二、PWMPOL:极性设置寄存器这个寄存器可以设置相应通道的PWM波在每个周期内是先出现高电平后低电平,或是先低电平后高电平。
PPOLn=1:n 通道对外输出波形先是高电平然后再变为低电平。
PPOLn=0:n通道对外输出波形先是低电平然后再变为高电平。
这个设置与占空比的计算有关。
三、PWMCLK:时钟选择寄存器PWM模块中共有四个时钟,分别为A、B、SA、SB。
对于第0、1、4、5通道,PCLKn=0时,则其通选择的是时钟A;当PCLKn=1时,其通道选择的是时钟SA。
对于2、3、6、7通道,PCLKn=0时,其通道选择的是时钟B,当PCLKn=1时,其通道选择的是时钟SB。
第2章 MC9S12DG128的结构与工作原理
![第2章 MC9S12DG128的结构与工作原理](https://img.taocdn.com/s3/m/7976ee0ebb68a98271fefa8a.png)
《基于HCS12的嵌入式系统设计》
口、字节数据链路通信接口和管脚中断逻辑。
《基于HCS12的嵌入式系统设计》
2.1 MC9S12DG128的内部结构
2.1.1 CPU12内核(Star Core)
中央处理单元CPU (Central Processing Unit)
CPU执行68HC12 CPU指令集结构,用3级指令队列来提升代码执行 效率。
《基于HCS12的嵌入式系统设计》
2.1 MC9S12DG128的内部结构
2.1.1 CPU12内核(Star Core)
CPU12内部寄存器
CPU12的寄存器集——基于累加 器,包括5个16位的寄存器和一个 8位的状态寄存器。其中,累加器 D又可分成两个8位的寄存器A和B, 16位寄存器D、X、Y通常用于暂 存数据或存储器地址;SP为堆栈 指针,用于指示堆栈的位置;PC 为程序指针,用于寻址程序代码; 条件码寄存器CCR用来反映运算 结果的特征,也控制CPU的行为。
LQFP112封装引脚图
QFP80封装引脚图
图2.1 MC9S12DG128内部结构框图
《基于HCS12的嵌入式系统设计》
2.1 MC9S12DG128的内部结构
图2.1为MC9S12DG128的内部结构框图,其中功能模块按
照112引脚封装给出。MC9S12DG128单片机的112个引脚
中,除了地址、数据、控制三总线外,主要是I/O引脚, 多数引脚具有两种或两种以上的功能。 图中左、右两部分分别是单片机的核心和接口部分,包括 CPU12、存储器、通用I/O、电压调整模块、后台调试模 块、系统运行监视模块、时钟产生模块、系统集成模块、 外部总线接口、A/D转换器、增强型捕捉定时器模块、脉 宽调制模块、串行通信接口、CAN总线接口、Byteflight接
MC9S12DG128系列例程--RTI
![MC9S12DG128系列例程--RTI](https://img.taocdn.com/s3/m/63c82d0379563c1ec5da7178.png)
MC9S12DG128系列例程--RTI2009-02-18 10:50Code Warrior 4.6Target : MC9S12DG128BCrystal: 16.000Mhzbusclock:16.000MHzpllclock:32.000MHz目录路径:F:\IVTech\============================================演示程序使用说明:1.实时时钟的演示:2.毫秒级计时输出;3.串口输出速率:9600bps.4.中断的使用。
********************************************************************* ********************/#i nclude <hidef.h> /* common defines and macros */#i nclude <mc9s12dg128.h> /* derivative information */#i nclude <stdio.h>#i nclude "LQprintp.h"#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"typedef unsigned char U8;typedef unsigned int U16;typedef unsigned long U32;typedef signed char S8;typedef signed int S16;volatile U32 u32_time_cnt=0;//====================中断函数==================================#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt 7 RTI_ISR(void) { // 32.75ms timer overflow++u32_time_cnt;PORTB_BIT2=~PORTB_BIT2;CRGFLG|=0X80;//Write 1 to clear RTIF bit}/******************************************************************** ************** 函数名: void DLY_ms(U16 x)*** 功能描述: 毫秒级延时;*** 全局变量: NO !*** 输入: U16 x !*** 输出: NO !*** 修改人:日期:2007-11-28*** 函数说明:********************************************************************* *********/void DLY_ms(int ms) //x取值1~255;{int ii,jj;if (ms<1) ms=1;for(ii=0;ii<ms;ii++)for(jj=0;jj<2770;jj++); //32MHz--1ms//for(jj=0;jj<4006;jj++); //48MHz--1ms//for(jj=0;jj<5341;jj++); //64MHz--1ms}//-----------------------------------------------------static void Port_Init(void){DDRA = 0xff;PORTA= 0x00;DDRB = 0xff; //LED PTB0--7,PORTB= 0xff; //LEDs on}//-----------------------------------------------------static void SCI_Init(void){SCI0CR2=0x2c; //enable Receive Full Interrupt,RX enable,Tx enable SCI0BDH=0x00; //busclk 8MHz,19200bps,SCI0BDL=0x1aSCI0BDL=0x68; //SCI0BDL=busclk/(16*SCI0BDL)//busclk 8MHz, 9600bps,SCI0BDL=0x34//busclk 16MHz, 9600bps,SCI0BDL=0x68//busclk 24MHz, 9600bps,SCI0BDL=0x9C} //busclk 32MHz, 9600bps,SCI0BDL=0xD0// setup of the RTI interrupt frequencystatic void RTI_Init(void){RTICTL=0x77; //8x2^16 =>32,75ms,30.5175Hz //CRGINT=0X80; //enable RTI InterruptCRGINT=0X80; //enable RTI Interrupt}// PLL初始化子程序 BUS Clock=16Mvoid setbusclock(void){CLKSEL=0X00; //disengage PLL to systemPLLCTL_PLLON=1; //turn on PLLSYNR=1;REFDV=1; //pllclock=2*osc*(1+SYNR)/(1+REFDV)=32MHz; _asm(nop); //BUS CLOCK=16M_asm(nop);while(!(CRGFLG_LOCK==1)); //when pll is steady ,then use it; CLKSEL_PLLSEL =1; //engage PLL to system;}//-----------------------------------------------------#pragma CODE_SEG DEFAULTvoid Init_Dev(void){setbusclock();Port_Init();SCI_Init();RTI_Init();}//====================main()==================================#pragma CODE_SEG DEFAULTvoid main(void){S8 txtbuf[66]="";U8 u8_mintes=0;U16 u16_sec=0,u16_ms=0;Init_Dev();PORTB=0x00;putstr("\nLongQiu s.&t.\n");DLY_ms(1000);PORTB=0xFF;EnableInterrupts;for(;;){//----------时钟计时器---------------------------------u16_sec=u32_time_cnt*131/4;//理论值为32.75ms,时间计算部分u16_ms=u16_sec%1000;u16_sec=u16_sec/1000;sprintf(txtbuf,"LONGQIU--time elapsed: %d:%02ds-%03dms",u8_mintes,u16_sec,u16_ms);printp("\n\t%s",txtbuf);if(u16_sec>58){u8_mintes++;u32_time_cnt=0;}//-------------------------------------------------------- PORTB_BIT0=~PORTB_BIT0;}//for(;;)} //main。
飞思卡尔智能车dg128单片机控制程序代码
![飞思卡尔智能车dg128单片机控制程序代码](https://img.taocdn.com/s3/m/3209747d5acfa1c7aa00cc4c.png)
void AD_Init(void)
{
ATD0CTL2=0xC0; //AD模块上电, 快速清零, 无等待模式, 禁止外部触发, 中断禁止
ATD0CTL3=0x44; //每次转换8个序列, FIFO, Freeze模式下继续转
ATD0CTL4=0x02; //10位精度, 采样时间为2个AD时钟周期,ATDClock=4MHz
//设置舵机
PWMCTL_CON01=1; //使得通道0,1成为16位pwm
PWMPER0 =0x75;
PWMPER1 =0x30; //舵机的频率是: 24M/8/30000=100Hz,T=10ms
PWMDTY01=4500; // 对应为4500/30000的占空比,待调整
Infrared_detect();
data_handle();
motor_ctl();
steer_ctl();
}
}
void interrupt 26 MDC_ISR(void)
{
static unsigned int number_count=0; static unsigned int start=0; static
go=2;
if(begin>=150)
go=3;
}
}
}
//-----系统初始化-----------------------
void system_init(void) //system initiat
void speed_ctl(void); //速度控制
void motor_ctl(void); //电机控制
void PACBInit(void);
Freescale 芯片 MC9S12DG128 产品说明书
![Freescale 芯片 MC9S12DG128 产品说明书](https://img.taocdn.com/s3/m/382907aa900ef12d2af90242a8956bec0875a551.png)
MC9S12DG128MFUE MC9S12DG128MPVE MC9S12DG128VPVE2x SCI 2x SPI2x CAN 2.0 A/BPWM8-bit, 8ch./16-bit,4-ch.I n t e r n a l B u sHCS12 CPU16-Key Wake-UpIRQ PortsVreg 5V to 2.5V Enhanced Capture Timer16-bit,8-ch.ATD010-bit,8-ch.8KB RAM128 KB Flash2KB EEPROMATD110-bit,8-ch.I 2C16-bit MicrocontrollersOverviewFreescale Semiconductor’s HCS12 Family of microcontrollers (MCUs) is the next generation of the highly successful 68HC12 ing Freescale’s industry-leading 0.25 µs Flash, the MC9S12DG128 is part of a pin-compatible family that scales from 32 KB to 512 KB of Flash memory. The MC9S12DG128 provides an upward migration path from Freescale’s 68HC08,68HC11 and 68HC12 architectures for applications that need larger memory, more peripherals and higher performance. Also, with the increasing number of CAN-based electronic control units (ECUs), its multiple network modules support this environment by enabling highly efficient communications between different network buses.Target Applications >Automotive applications >Industrial controlHigh-Performance 16-bit HCS12 CPU Core>25 MHz bus operation at 5V for 40 ns minimum instruction cycle time >Opcode compatible with the 68HC11 and 68HC12>C-optimized architecture produces extremely compact codeOn-Chip Debug Interface>Dedicated serial debug interface >On-chip breakpoints>Real-time in-circuit emulation and debug without expensive and cumbersome box emulators >Read/write memory and registers while running at full speedNetwork Modules >Two msCAN modules implementing the CAN 2.0 A/B protocol •Five receive buffers per module with FIFO storage scheme•Three transmit buffers per module with internal prioritization>Ability to link modules for higher buffer count >Programmable bit rate up to 1 Mbps >FIFO receive approach superior for event-driven networksIntegrated Third-Generation Flash Memory>In-application reprogrammable >Self-timed, fast programming •Fast Flash page erase—20 ms (512 bytes)•Can program 16 bits in 20 µs while in burst mode>5V Flash program/erase/read>Flash granularity—512 byte Flash erase/2 byte Flash program >Two independently programmable Flash arrays >Flexible block protection and security>Flexibility to change code in the field >Efficient end-of-line programming >Total program time for 128 KB code is less than five seconds >Reduces production programming cost through ultra-fast programming >No external high voltage or charge pump required >Virtual EEPROM implementation, Flash array usable for EE extension >Can erase one array while executing code from another2 KB Integrated EEPROM>Flexible protection scheme for protection against accidental program or erase >EEPROM can be programmed in 46 µs>Can erase 4 bytes at a time and program 2 bytes at a time for calibration, security,personality and diagnostic informationMC9S12DG128MFUE MC9S12DG128MPVE MC9S12DG128VPVE。
飞思卡尔MC9S12XS128功能模块驱动
![飞思卡尔MC9S12XS128功能模块驱动](https://img.taocdn.com/s3/m/4577b8a971fe910ef12df84e.png)
用了一年多飞思卡尔MC9S12XS128这款处理器,现在总结下各个功能模块的驱动.//锁相环时钟的初始化总线频率为40MHz(总线时钟为锁相环时钟的一半)//晶振为11.0592MHzvoid PLL_init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1) { //锁相环时钟= 2*11.0592*(39+1)/(10+1)=80MHz 总线时钟为40MHzREFDV=0x0A;SYNR=0x67; //0110_0111 低6位的值为19,高两位的值为推荐值while(CRGFLG_LOCK != 1);CLKSEL_PLLSEL = 1; //选定锁相环时钟//FCLKDIV=0x0F; //Flash Clock Divide Factor 16M/16=1M}//周期中断定时器的初始化-// //周期中断通道1用于脉冲累加器的定时采样,定时周期为: 10ms= (199+1)*(1999+1)/(40M) (没有使用)//周期中断通道0用于控制激光管的轮流发射,定时周期为: 2000us= (399+1)*(199+1)/(40M)//2011/4/4 15:24 定时时间改为1msvoid PIT_init(void){PITCFLMT_PITE = 0; // 禁止使用PIT模块 PITCFLMT :PIT 控制强制加载微计数器寄存器。
PITCE_PCE0 = 1; // 使能定时器通道0//PITCE_PCE1 = 1; //使能定时器通道1PITMUX = 0; //通道0,和通道1均选择8位微计数器0//修改时间只需要改下面四行PITMTLD0 = 199; //向8位微计数器中加载的值PITLD0 = 199; //向16位计数器中加载的值//PITMTLD1 = 39; //向8位微计数器中加载的值 8位,最大值不要超过255//PITLD1 = 1999; //向16位计数器中加载的值PITINTE |= 0x01; //使能定时器通道0的中断PITCFLMT_PITE = 1;//使能PIT模块}//脉冲累加器的初始化, PT7口外接光电编码器//最新修改: 2011/3/25 16:53void PT7_PulAcc_Init(void){DDRT &= 0x77;//设置PT7,PT3口为输入(硬件上PT7,PT3通过跳线联到了一块)PERT |= 0x80; //使能通道7的上拉电阻PPST &= 0x7f; //电阻设为上拉电阻TCTL4 &= 0x3f; //禁止PT3的输入捕捉功能PACTL = 0x50; //启动脉冲累加计数器,上升沿触发,禁止触发中断和溢出中断,主定时器禁止}//通道1用于控制舵机1 PWM 高电平有效,//通道3用于控制电机1 PWM 低电平有效,这与前两代车高电平有效有区别!!!!!//通道7用于给上排激光管提供PWM信号 PWM高电平有效!!!!!//通道6用于给下排激光管提供PWM信号 PWM高电平有效!!!!!// 2011-03-17 7:56 增加了A端口的使用新增通道6//2011-6-9 23:03 //增加了通道4,5的联合使用,用于控制下排方向舵机 void PWM_init(void){PWME = 0x00;//PWM禁止PWMPRCLK = 0x03; // ClockA=40M/8=5M, Clock B = 40M/1=40M PWMSCLB = 10; // Clock SB= 40/2*10= 2MHz(供电机)PWMSCLA = 5; // SA = Clock A/2*5 = 5M/10 = 500K = SA 用于控制舵机PWMPOL = 0xe2; //1110_0010通道7,通道6与通道1、通道5先输出高电平然后输出低电平,POLx=1先输出高电平后输出低电平; PPOLx=0先输出低电平)PWMCAE = 0x00; // 左对齐输出(CAEx=0为左对齐,反之为中心对齐)//PWMCLK = 0010_1010 (0 1 4 5位控制SA_1;或A_0; 2 3 6 7位控制SB_1 或B_0)//为PWM通道1选择时钟 SA(500KHz),//为PWM通道5选择时钟 SA(500KHz),//为通道3选择时钟 SB(10MHz)//为通道7选择时钟B(40MHz)//为通道6选择时钟B(40MHz)PWMCLK = 0x2A; //0010_1010PWMCTL = 0x70; //0111_0000 CON45=1,把通道4,5联合使用。
飞思卡尔MC9S12XS128各模块初始化程序--超详细注释
![飞思卡尔MC9S12XS128各模块初始化程序--超详细注释](https://img.taocdn.com/s3/m/fee277dd26fff705cc170ac9.png)
飞思卡尔MC9S12XS128各模块初始化程序--超详细注释//**************************************************************************// 武狂狼2014.5.1 整理// 新手入门的助手////***************************************************************************注释不详细/*********************************************************/函数名称:void ATD0_init(void)函数功能:ATD初始化入口参数:出口参数:/***********************************************************/void ATD0_init(void){ATD0DIEN=0x00; //使用模拟输入功能|=1;数字输入功能// ATD0CTL0=0x07; //Bit[3:0]WRAP[3:0] 反转通道选择位ATD0CTL1=0x40; // 12位精度,采样前不放电 Bit[7]ETRIGSEL(外部触发源选择位。
=0选择A/D通道AN[15:0] |=1选择 ERTIG3~0)和Bit[3:0]ETRIGCH[3:0]选择外部触发通道// Bit[6:5]SRES[1:0]A/D分辨率选择位。
Bit[4]SMP_DIS =0采样前不放电|=1采样前内部电容放电,这会增加2个A/D时钟周期的采样时间,有助于采样前进行开路检测ATD0CTL2=0x40; // 快速清零,禁止中断,禁止外部触发ATD0CTL3=0x90; // 右对齐,转换序列长度为2,非FIFOATD0CTL4=0x03; // 采样时间4个周期,PRS=31,F(ATDCLK)=F(BUS)/(2(PRS+1))// ATD0CTL5=0x30; //启动AD转换序列//:对每项数据采集时,用到哪个通道采样可在相应子函数内设置某一通道(见Sample_AD.c)while(!ATD0STAT2L_CCF0);/*********************************************************/函数名称:void PIT_init(void)函数功能:初始化PIT 设置精确定时时间(1s)入口参数:无出口参数:无说明:无/***********************************************************/void PIT_init(void){PITCFLMT=0x00; //禁止PIT模块Bit[7] PITE:PIT模块使能位,0禁用|1使能// Bit[6] PITSWAI:等待模式下PIT停止位,0等待模式下,PIT模块正常运行| 1等待模式下,PIT模块停止产生时钟信号,冻结PIT模块// Bit[5] PITFRZ: 冻结模式下PIT计数器冻结位。
飞思卡尔DG128_PE编程入门教程
![飞思卡尔DG128_PE编程入门教程](https://img.taocdn.com/s3/m/ca6f88ce4028915f804dc264.png)
飞思卡尔DG128—PE编程入门教程(1)首先打开CodeWarrior 5.0 开发环境,然后在弹出的选项中选择新建工程注释:如果没有弹出这个对话框,可以在下面的File中选择New Project新建一个工程。
(2) 选择开发芯片的型号(这里我们使用的是MC9S12DG128)接着选择TBDML,这个是我们使用在线调试功能的选项。
(3) 选择工程的生成路径,注意:如果我们不使用PE编程功能的话,在这步结束后,可以直接选择完成按钮来完成工程的新建。
(4) (PE编程功能的步骤)下一步,这个对话框我们什么都不用选择,直接点击下一步。
(5)选择下面这个选项来启动PE编程功能。
(6) 红色边框中选项的功能为是否启动浮点数据的使用,默认第一个是不启用;第二个是启用,float数据为32位,double为32位;第三个是启用,float 数据为32位,double数据为64位。
(7)最后一步什么都不要设置,直接点击完成。
(8) 以上步骤我们完成了一个DG128工程的新建步骤。
PE的使用步骤:(1) 新建工程后,会自动弹出个芯片封装型号的选择,选择后点击OK。
(注意:我们学校使用的芯片是112管脚,所以注意选择红线标注的选项)(2) 点击OK后,就会出现我们要编程的环境了。
如下所示:(3)红色标注的地方就是该工程的工作区。
细心的同学就会发现,它生成的文件中没有我们需要写的源文件XXX.c 。
那我们现在就来生成这些文件,找到下图的选项Processor Expert 。
然后点击第二个选项的Generate Code ' XXX .mcp' (这里的XXX 表示该工程名称)。
下面是自动生成的文件。
这时候发现软件为我们自动的生成了一个Project.c (Project 是我这个工程建立的文件命,不同的工程文件名将导致这个名字不同)的文件。
这个就是我们将要编写的源文件了,它里面包含了主函数main()。
飞思卡尔PWM程序(含详细指令说明)
![飞思卡尔PWM程序(含详细指令说明)](https://img.taocdn.com/s3/m/7ce1bc8bcc22bcd126ff0c0a.png)
//在任何时间都是可读、可写的,复位时全置0。应当注意的是,如果当一个 PWM
//输出波形正在产生时,时钟改变,这时就会产生一个平头的或线形脉冲。
//用法: PCLK1=1; 1 通道的时钟源设为 SA。 PCLK1=0; 1 通道的时钟源设为 A。
//如果通道不可用,那么对周期寄存器进行写操作,将会直接导致周期寄存器同缓冲器一起
//闭锁。
//周期的计算方法:(因为左对齐和居中对齐方式输出时的计数器工作方式不一样)
//1) 当 CAEx=0时,即进行左线性输出时:
// `PWMx 周期=通道时钟周期*PWMPERx
PWMPOL_PPOL3=1; // Duty=High Time 极性设置
//3通道对外输出为先高后低(PWMPOL_PPOL3=0 则3通道对外输出为先低后高)
PWMCAE_CAE3=0; // Left-aligned 对齐方式设置
//------------------------------------------------------------------------------------------------------------------//
//功能说明:MC9S12XS128--PWM例程
//使用说明:实现通道3(PTP3)输出频率为1KHz,占空比为50%的方波,用示波器观察
//决定了相关 PWM 通道的周期。 每一个通道的周期寄存器都是双缓冲的,因此如果当通
//道使能后,改变他们的值,将不会发生任何作用,除非当下列情况之一发生:
//*有效的周期结束。
MC9S12XS128例程
![MC9S12XS128例程](https://img.taocdn.com/s3/m/5a23604da88271fe910ef12d2af90242a895ab1e.png)
MC9S12XS128例程SCI程序串行通信时MCU与外部设备之间进行通信的一种简单而有效的硬件方法。
无论用查询方式还是中断方式进行串行通信编程,在程序初始化时均必须对SCI进行初始化。
初始化主要包括波特率设置、通信格式的设置、发送接收数据方式的设置等。
对SCI进行初始化,需要设置如下几部分:(1)定义波特率一般选内部总线时钟为串行通信的时钟源。
通过设置SCI波特率寄存器SCI0BD的波特率选择位SBR[12:0],来选择合适的分频系数。
(2)写控制字到SCI控制寄存器1(SCI0CR1)设置是否允许SCI、数据长度、输出格式、选择唤醒方法、是否校验等。
(3)写控制字到SCI控制寄存器2(SCI0CR2)设置是否允许发送与接收、是中断接收还是查询接收等。
串行通信程序如下:/** write in “Init.h” **/#include /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */ //void InitBusClk(void); //可以不使用锁相环void InitSci(void);/** write in “Init.c” **///初始化程序#include "Init.h"/*//------------初始化Bus Clock------------//void InitBusClk(void) {DisableInterrupts;CLKSEL=0X00; //PLLSEL 1 : Bus Clock=PLLCLK/2// 0 : Bus Clock=OSCCLK/2PLLCTL_PLLON=1; //开启PLLSYNR=0; //OSCCLK=16MHzREFDV=0X0F;//PLLCLK=2*OSCCLK*[(1+SYNR)/(1+REFDV]=32/16=2MHz while(!(CRGFLG_LOCK==1)); //直到LOCK=1,when PLL is ready,退出循环CLKSEL_PLLSEL=1; //PLLSEL 1 : Bus Clock=PLLCLK/2=2MHz/2=1MHz// 0 : Bus Clock=OSCCLK/2=16M/2=8MHz}*///---------------初始化SCI---------------//void InitSci(void){SCI0BD=4545; //设波特率为110//SCI baud rate = SCI module clock/(16*SCIBD)=Bus Clock/(16*SCIBD)// = 8MHz/(16*4545)=500kHz/4545=110bps//SCIBD : SBR12-SBR0,Value from 1 to 8191SCI0CR1=0;SCI0CR2=0X2C; // 0010 1100 RIE=1,TE=1,RE=1// RIE=1 RDRF and OR interrupt requests enabled// TE=1 Transmitter enabled// RE=1 Receiver enabled}/** write in “SCI.h” **///函数声明unsigned char SciRead();void SciWrite(byte);/** write in “SCI.c” **///串行通信程序#include "Init.h"#include "SCI.h"//---------------读SCI数据---------------//unsigned char SciRead(){if(SCI0SR1_RDRF==1){//数据从移位寄存器传送到SCI数据寄存器SCIDRL//SCI0SR1_RDRF==1表明数据寄存器SCI0DRL为满,可以接收新的数据SCI0SR1_RDRF=1; //读取SCI数据寄存器会将RDRF清除,重新置位return SCI0DRL; //返回数据寄存器的数值}}//---------------写SCI数据---------------//void SciWrite(byte sci_value){while(!(SCI0SR1&0X80));//SCI0SR1_TDRE==1表明数据寄存器SCI0DRL为空,可以发送新的数据SCI0DRH=0;SCI0DRL=sci_value; //发送新的数据至数据寄存器SCI0DR}//---------------中断程序-----------------//#pragma CODE_SEG NON_BANKEDinterrupt 20 void Sci_Intrrupt(void){ //SCI的中断向量号为20 byte text;DisableInterrupts; //关中断text=SciRead(); //接收数据寄存器SCI0DRL中的数据asm nop;asm nop;SciWrite(text); //发送数据至数据寄存器SCI0DRLDDRA=0XFF; //设A口为输出,用来显示是否执行中断,可以不用PORTA_PA6=!PORTA_PA6;EnableInterrupts; //开中断}#pragma CODE_SEG DEFAULT/** write in “main.c”” **/#include "Init.h"#include "SCI.h"void main(void) {/* put your own code here */_DISABLE_COP(); //关看门狗DisableInterrupts; //关中断//InitBusClk();InitSci();EnableInterrupts; //开中断for(;;) {// _FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}A/D转换应用实例要让ATD 开始转换工作,必须经过以下三个步骤:1.将ADPU 置1,使ATD 启动;2.按照要求对转换位数、扫描方式、采样时间、时钟频率及标志检查等方式进行设置;3.发出启动命令;如果上电默认状态即能满足工作要求,那么只要将ADPU 置1,然后通过控制寄存器发出转换命令,即可实现转换。
FreeScale HCS12系列单片机教程(dg128)
![FreeScale HCS12系列单片机教程(dg128)](https://img.taocdn.com/s3/m/9b3ff00abb68a98271fefac1.png)
HCS12微控制器系列教程---第一讲:PWM 模块介绍该教程以MC9S12DG128单片机为核心进行讲解,全面阐释该16位单片机资源。
本文为第一讲,开始介绍S12 MCU的PWM模块。
PWM 调制波有8 个输出通道,每一个输出通道都可以独立的进行输出。
每一个输出通道都有一个精确的计数器(计算脉冲的个数),一个周期控制寄存器和两个可供选择的时钟源。
每一个PWM 输出通道都能调制出占空比从0—100% 变化的波形。
PWM 的主要特点有:1、它有8 个独立的输出通道,并且通过编程可控制其输出波形的周期。
2、每一个输出通道都有一个精确的计数器。
3、每一个通道的PWM 输出使能都可以由编程来控制。
4、PWM输出波形的翻转控制可以通过编程来实现。
5、周期和脉宽可以被双缓冲。
当通道关闭或PWM计数器为0时,改变周期和脉宽才起作用。
6、8 字节或16 字节的通道协议。
7、有4 个时钟源可供选择(A、SA、B、SB),他们提供了一个宽范围的时钟频率。
8、通过编程可以实现希望的时钟周期。
9、具有遇到紧急情况关闭程序的功能。
10、每一个通道都可以通过编程实现左对齐输出还是居中对齐输出。
HCS12微控制器系列教程---第二讲:PWM 寄存器简介1、PWM启动寄存器PWMEPWME 寄存器每一位如图1所示:复位默认值:0000 0000B图1 PWME 寄存器每一个PWM 的输出通道都有一个使能位PWMEx 。
它相当于一个开关,用来启动和关闭相应通道的PWM 波形输出。
当任意的PWMEx 位置1,则相关的PWM输出通道就立刻可用。
用法:PWME7=1 --- 通道7 可对外输出波形PWME7=0 --- 通道7 不能对外输出波形注意:在通道使能后所输出的第一个波形可能是不规则的。
当输出通道工作在串联模式时(PWMCTL寄存器中的CONxx置1),那么)使能相应的16位PWM 输出通道是由PWMEx的高位控制的,例如:设置PWMCTL_CON01 = 1,通道0、1级联,形成一个16位PWM 通道,由通道 1 的使能位控制PWM 的输出。
飞思卡尔单片机mc9s12dg128的pwm参考程序
![飞思卡尔单片机mc9s12dg128的pwm参考程序](https://img.taocdn.com/s3/m/b179880ee97101f69e3143323968011ca300f714.png)
飞思卡尔单片机mc9s12dg128的pwm参考程序demon*********************************************************pwme=0x22;//通道01,45使能pwmpol=0x22;//通道01和45输出波形的起始极性为1pwmctl=0x50//通道01,45级联pwmclk=0x02;//通道01选择sa为时钟源pwmsla=0x04;//通道01时钟SA为3MHz(24/(2*4))pwmper01=60000//设置通道01的输出频率(50Hz)pwmper45=12000//设置通道45的输出频率(2KHz)}/***********************************************************pwm输出函数bydemon2021-5-12*程序描述;从输入参数到转向机和电机输出相应的PWM*参数:转向机方向:3300-5700转速:0-12000*********************************************************/voidpwm(intspeed,int direction)//pwm{pwm_uu初始();if(direction<3300)direction=3300;if(direction>5700)direction=5700;pwmdty01=dir ection;如果(速度>12000)速度=12000;pwmdty45=速度;}飞思卡尔单片机mc9s12dg128的io口初始化参检查程序demonportb=porta;}enableinterrupts;对于(;;){}/*永远等待*//*pleasemakesurethatyouneverleavethisfunction*/}飞思卡尔MCU MC9S12DG128 ad初始化参考程序voidad(void){wordt0=0;wordt1=0;wordt2=0;wordt3=0;wordt4=0;wordt5=0;wordt6=0;wordt7=0;while(atd0stat0_scf){t0=atd0dr0;ad00=(byte)(t0>>8);//高8位移到低8位且高8位为0t1=atd0dr1;ad01=(byte)(t1>>8);t2=atd0dr2;ad02=(byte)(t2>>8);t3=atd0dr3;ad03=(byte)(t3>>8);t4=atd0dr4;ad04=(byte)(t4>>8);t5=atd0dr5;ad05=(byte)(t5>>8);t6=atd0dr6;ad06=(byte)(t6>>8);t7=atd0dr7;ad07=(byte)(t7>>8);}。
mc9s12xs128程序教程
![mc9s12xs128程序教程](https://img.taocdn.com/s3/m/4fb138e2e009581b6bd9ebfa.png)
711 次
该寄存器是 0~7 通道 PWM 输出起始极性控制位,用来设置 PWM 输出的起始 电平。
用法:PWMPOL_PPOL0=1--- 通道 0 在周期开始时输出为高电平,当计数 器等于占空比寄存器的值时,输出为低电平。对外输出波形先是高电平然后再变 为低电平。
2、PWM 波形对齐寄存器 PWMCAE
该控制寄存器设定通道的级联和两种工作模式:等待模式和冻结模式。这 两种模式如图 10 和图 11 所示。
图 10 等待模式
图 11 冻结模式
只有当相应的通道关闭后,才能改变 这些控制字。 用法: PWMCTL_CON67=1 --- 通道6、7 级联成一个 16 位的 PWM 通道。此 时只有7 通道的控制字起作用,原通道 7 的使能位、PWM 输出极性选择位、时 钟选择控制位以及对齐方式选择位用来设置级联后的 PWM 输出特性 PWMCTL_CON67=0 --- 通道6,7 通道不级联 CON45、CON23、CON01 的用法同 CON67 相似。设置此控制字的意 义在于扩大了PWM 对外输出脉冲的频率范围。 PSWAI=1 --- MCU 一旦处于等待状态,就会停止时钟的输入。这样就不 会因时钟在空操作而费电;当它置为0,则MCU 就是处于等待状态,也允许 时钟的输入。 PFRZ=1 --- MCU 一旦处于冻结状态,就会停止计数器工作。 (责任编辑:dzsj8)
1、PWM 预分频寄存器 PWMPRCLK
PWMPRCLK 寄存器每一位如图 3 所示:
复位默认值:0000 0000B
813 次
图3 PWMPRCLK 寄存器
PWMPRCLK 寄存器包括 ClockA 预分频和 ClockB 预分频的控制位。ClockA、 ClockB 的值为总线时钟的 1/2n (0≤n≤7),具体设置参照图 4 和图 5
飞思卡尔单片机烧写程序步骤
![飞思卡尔单片机烧写程序步骤](https://img.taocdn.com/s3/m/087230dbd15abe23482f4df3.png)
创建一个工程
选择单片机的型号,我一直用的是mc9s12xs128的单片机,然后在“choose your default connection:”里面选择最后一个“TBDML”,TBDML是一个仿真器,飞思卡尔单片机用的BDM 仿真器,选择好后下一步
这一步就是建立工程的名字和位置,左边选择语言类型,选择C即可,设置好名字和位置后点下一步
这个窗口指的是要不要从一个位置添加先前存在的工程,不用添加,直接下一步
直接下一步
这一步需要注意,在“Select the floating point format supported…….”里选择第二项,如上图,是选择浮点类型长度,选别的可能编译的时候出错,我也不知道为什么
这一步直接默认
直接点完成
即可完成工程的建立
工程建立后自动出来这个画面
在左边栏里,双击main.c会出来主程序,在里面写程序即可,写好后点一下这个按钮,生成一系列文件,如果没有错误,就不会有提示,遇到warming,一般没什么大问题,只要不是error就行,
然后烧写程序点绿色箭头,烧程序单片机通电。
先确保你的电脑装好仿真器的驱动,在资源管理器里面查看
同上显示的话表示正常,如果有黄色感叹号,则需要重新安装驱动。
freescale 单片机MC9S12G128应用程序(PWM,Timer,ADC……)
![freescale 单片机MC9S12G128应用程序(PWM,Timer,ADC……)](https://img.taocdn.com/s3/m/0cdb72dece2f0066f53322da.png)
PWM应用程序/*程序实现功能:PP1口输出PWM方波程序说明:通过改变duty和period ,从而控制PWM周期和占空比duty cycle=duty/periodPWM frequency=1M/(2*period)(Fbus=24M,scla=24)*/#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */void SetBusClock_24MHZ(void);void PWMDisable(byte channel);void PWMEnable(byte channel);void PWMSinglePortSetting(byte channel ,byte period ,byte duty) ;void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align) ; void Service_WD(void);void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl);void PWMConcatenateSetting(byte channel,word period,word duty);void main(void){/* put your own code here *///总线时钟频率设置:24MSetBusClock_24MHZ();//对预分频时钟,分频时钟A,分频时钟B和控制寄存器的配置//0分频01级联PWMGeneralInitial(0,24,0,0x10);//PWM端口寄存器的配置// 1通道SA时钟起始高电平左对齐PWMsinglePortInitial(1,0,1,1,0);//PWM级联输出配置//50HZ 占空比12.5%PWMConcatenateSetting(1,10000,250);//EnableInterrupts;for(;;) {_FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}//*********************************************//函数名:PWMEnable//函数功能:PWM单个端口使能//函数参数:一个byte 类型channel 代表PWM通道号// 返回值:无//********************************************void PWMEnable(byte channel){if(channel>7) channel=7;PWME|=(1<<channel); //选择使能位}//**********************************************//函数名称:PWMDisable//函数功能:PWM单个端口禁止//函数参数:一个byte类型channel 代表PWM通道号//返回值:无//***********************************************void PWMDisable(byte channel){if(channel>7) channel=7;PWME&=~(1<<channel); //选择禁止位}//函数功能:启动看门狗void Service_WD(void){CPMUARMCOP=0x55;CPMUARMCOP=0xAA;}//函数功能:总线时钟设置void SetBusClock_24MHZ(void){CPMUOSC_OSCE=1; //enable osc/*时钟倍频:24MHz BusClock48MHz VCO48MHz PLL*/CPMUSYNR=0x00|0x05; //VCOFRQ[1:0],SYNDIV[5:0]CPMUREFDIV=0x20|0x03;//REFFRQ[1:0],REFDIV[3:0]CPMUPOSTDIV=0x00; //POSTDIV=0;while(!CPMUFLG_LOCK)//等待VCO稳定Service_WD(); //看门狗CPMUCLKS_PLLSEL=1;}//*********************************************//函数名称:PWMSinglePortSetting//函数功能:实现PWM周期寄存器和占空比寄存器通道的单独输出//函数参数:3个byte类型//参数1:channel代表了当前配置的PWM通道//参数2:period 周期配置参数/*Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERxCenter Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)*///参数3:duty 占空比配置参数/*Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%*///返回值:无//**********************************************void PWMSinglePortSetting(byte channel ,byte period ,byte duty){if(channel>7) channel=7;PWMDisable(channel); //禁止该通道switch(channel){case 0:PWMPER0=period; //设置周期寄存器PWMDTY0=duty; //设置占空比寄存器break;case 1:PWMPER1=period; //设置周期寄存器PWMDTY1=duty; //设置占空比寄存器case 2:PWMPER2=period; //设置周期寄存器PWMDTY2=duty; //设置占空比寄存器break;case 3:PWMPER3=period; //设置周期寄存器PWMDTY3=duty; //设置占空比寄存器break;case 4:PWMPER4=period; //设置周期寄存器PWMDTY4=duty; //设置占空比寄存器break;case 5:PWMPER5=period; //设置周期寄存器PWMDTY5=duty; //设置占空比寄存器break;case 6:PWMPER6=period; //设置周期寄存器PWMDTY6=duty; //设置占空比寄存器break;case 7:PWMPER7=period; //设置周期寄存器PWMDTY7=duty; //设置占空比寄存器break;default:break;}PWMEnable(channel);}//*********************************************//函数名:PWMSinglePortInitial//函数功能:PWM端口寄存器的配置//函数参数:5个byte类型//参数1:channel 代表了当前配置的PWM通道//参数2:clkab 参数2,3决定了时钟源的选择//参数3: clock/*PWM Channel 0,1,4,5PCLKAB[0,1,4,5] PCLK[0,1,4,5] Clock Source Selection0 0 Clock A0 1 Clock SA1 0 Clock B1 1 Clock SBPWM Channel 2,3,6,7PCLKAB[2,3,6,7] PCLK[2,3,6,7] Clock Source Selection0 0 Clock B0 1 Clock SB1 0 Clock A1 1 Clock SA*///参数4:polarity PWM极性选择// 0 开始为低电平,周期计数开始为高电平// 1 开始为高电平,周期计数开始为低电平//参数5:align PWM对齐方式选择// 0 输出左对齐// 1 输出中心对齐//返回值:无//**********************************************void PWMsinglePortInitial(byte channel, byte clkab,byte clock, byte polarity,byte align) {if(channel>7) channel=7;//禁止该通道PWMDisable(channel);// PWM 时钟A/B 选择if(clkab==0) PWMCLKAB&=~(1<<channel);else PWMCLKAB|=(1<<channel);// PWM 时钟选择寄存器设置if(clock==0) PWMCLK&=~(1<<channel);else PWMCLK|=(1<<channel);//PWM 极性选择设置if(polarity==0) PWMPOL&=~(1<<channel) ;else PWMPOL|=(1<<channel);//PWM 对齐方式设置if(align==0) PWMCAE&=~(1<<channel);else PWMCAE|=(1<<channel);}//**********************************************************//函数名:PWMGeneralInitial//函数功能:对预分频时钟,分频时钟A,分频时钟B和控制寄存器的配置//函数参数:4个byte类型//参数1 prclk/*Clock A or Clock B Prescaler SelectsPCKA/B2 PCKA/B1 PCKA/B0 Value of Clock A/B0 0 0 Bus clock0 0 1 Bus clock / 20 1 0 Bus clock / 40 1 1 Bus clock / 81 0 0 Bus clock / 161 0 1 Bus clock / 321 1 0 Bus clock / 641 1 1 Bus clock / 128*///参数2:scla// Clock SA = Clock A / (2 * PWMSCLA)//参数3:sclb// Clock SB = Clock B / (2 * PWMSCLB)//参数4:ctl/*control[CON67,CON45,CON23,CON01,PSWAI,PFRZ]PWM级联控制寄存器CON67,CON45,CON23,CON010 单独一个通道1 两个通道级联PSWAI 0 等待模式禁止时钟输入1 等待模式允许时钟输入PFRZ 0 冻结模式允许PWM时钟输入1 冻结模式禁止PWM时钟输入//返回值:无*///**************************************************************void PWMGeneralInitial(byte prclk,byte scla,byte sclb,byte ctl){//禁止所有的PWM通道PWME=0x00;//设置预分频参数PWMPRCLK=prclk;//设置A分频参数PWMSCLA=scla;//设置B分频参数PWMSCLB=sclb;//级联配置PWMCTL=ctl;}//***********************************************************//函数名称:PWMConcatenateSetting//函数功能:PWM级联输出配置//函数参数:1个byte类型,2个word类型//参数1:channel代表了当前配置的PWM通道//参数2:period 周期配置参数/*Left aligned output (CAEx = 0) PWMx Period = Channel Clock Period * PWMPERxCenter Aligned Output (CAEx = 1) PWMx Period = Channel Clock Period * (2 * PWMPERx)*///参数3:duty 占空比配置参数/*Polarity = 0 (PPOL x =0) Duty Cycle = [(PWMPERx-PWMDTYx)/PWMPERx] * 100%Polarity = 1 (PPOLx = 1) Duty Cycle = [PWMDTYx / PWMPERx] * 100%*///返回值:无//**************************************************************void PWMConcatenateSetting(byte channel,word period,word duty){if(channel>7) channel=7;switch(channel){case 0:case 1:PWMDisable(0); //禁止通道0PWMDisable(1); //禁止通道1PWMPER01=period; //设置周期寄存器PWMDTY01=duty; //设置占空比寄存器PWMEnable(0); //使能通道0;PWMEnable(1); //使能通道1;break;case 2:case 3:PWMDisable(2); //禁止通道2PWMDisable(3); //禁止通道3PWMPER23=period; //设置周期寄存器PWMDTY23=duty; //设置占空比寄存器PWMEnable(2); //使能通道2;PWMEnable(3); //使能通道3;break;case 4:case 5:PWMDisable(4); //禁止通道4PWMDisable(5); //禁止通道5PWMPER45=period; //设置周期寄存器PWMDTY45=duty; //设置占空比寄存器PWMEnable(4); //使能通道4;PWMEnable(5); //使能通道5;break;case 6:case 7:PWMDisable(6); //禁止通道6PWMDisable(7); //禁止通道7PWMPER67=period; //设置周期寄存器PWMDTY67=duty; //设置占空比寄存器PWMEnable(6); //使能通道6;PWMEnable(7); //使能通道7;break;default:break;}}定时器应用程序#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */// 函数声明void OutputCompare_Init(void);;void Service_WD(void);void SetBusClock_24MHz(void);// 全局变量uint Timer7_Cnt=0;void main(void) {/* put your own code here */SetBusClock_24MHz();OutputCompare_Init();EnableInterrupts;for(;;) {_FEED_COP(); /* feeds the dog */} /* loop forever *//* please make sure that you never leave main */}void OutputCompare_Init(void){TSCR1_TEN = 0; /* Disable Timer module before adjusting registers. */ TIOS_IOS7 = 1; /* Set Channel 0 as output compare. */ TCTL1_OM7 = 0; /* Set channel 0 to toggle when a Timer match occurs. */ TCTL1_OL7 = 1; /* Set channel 0 to toggle when a Timer match occurs. */ TC7 = 0x4926; /* Set a value for channel 0 timer compare. */ TIE_C7I = 1; /* Enable channel 0 interrupt, handled by function TIM0ISR. */TSCR1_TSWAI = 1; /* Disables the timer module while in wait mode. */ TSCR1_TSFRZ = 1; /* Disables the timer counter while in freeze mode. */TSCR2_PR = 0x7; /* Set prescaler to divide by 128 */ TSCR2_TCRE = 1;TSCR1_TEN = 1; /* Timer Enable. *///中断周期:0x4926*128/24MHz = 100ms}#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt VectorNumber_Vtimch7 TIM7_ISR(void){Timer7_Cnt++;TFLG1 = TFLG1_C7F_MASK; /* Clear channel 0 flag. */}#pragma CODE_SEG DEFAULT// 看门狗void Service_WD(void){CPMUARMCOP = 0x55;CPMUARMCOP = 0xAA;}void SetBusClock_24MHz(void){CPMUOSC_OSCE = 1; /* enable ext osc *//*Initialise the system clock from a 16 MHz Crystal,24 MHz Bus CLK (48 MHz VCO, 48 MHz PLL)*/CPMUSYNR = 0x00 | 0x05; /* VCOFRQ[7:6], SYNDIV[5:0] */ CPMUREFDIV = 0x20 | 0x03; /* REFFRQ[7:6], REFDIV[3:0] */ CPMUPOSTDIV = 0x00; /* POSTDIV = 0 FPLL = FVCO */ while(!CPMUFLG_LOCK); /* wait for VCO to stabilize*/ Service_WD();CPMUCLKS_PLLSEL = 1; /* Switch clk to use PLL */}SCI应用程序#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */// 函数声明void SCI0_Init(void);void SCI0_BR(unsigned long br);void SCI0_SendByte(char ch);void Service_WD(void);void SetBusClock_24MHz(void);// 全局变量char SCI_Flag = 0;char SCI_Rev = 0;void main(void) {/* put your own code here */SetBusClock_24MHz();SCI0_BR(38400);SCI0_Init();EnableInterrupts;SCI0_SendByte(0x01);SCI0_SendByte(0x02);SCI0_SendByte(0x03);for(;;) {_FEED_COP(); /* feeds the dog */if(SCI_Flag==1) {SCI_Flag = 0;SCI0_SendByte(SCI_Rev);}} /* loop forever *//* please make sure that you never leave main */}void Service_WD(void){CPMUARMCOP = 0x55;CPMUARMCOP = 0xAA;}void SetBusClock_24MHz(void){CPMUOSC_OSCE = 1; /* enable ext osc *//*Initialise the system clock from a 16 MHz Crystal,24 MHz Bus CLK (48 MHz VCO, 48 MHz PLL)*/CPMUSYNR = 0x00 | 0x05; /* VCOFRQ[7:6], SYNDIV[5:0] */ CPMUREFDIV = 0x20 | 0x03; /* REFFRQ[7:6], REFDIV[3:0] */ CPMUPOSTDIV = 0x00; /* POSTDIV = 0 FPLL = FVCO */ while(!CPMUFLG_LOCK); /* wait for VCO to stabilize*/Service_WD();CPMUCLKS_PLLSEL = 1; /* Switch clk to use PLL */}//串口初始化void SCI0_Init(void){SCI0CR1 = 0x00; /* 8 Data Bits, 1 Start Bit, 1 Stop Bit, No Parity */SCI0CR2 = 0x2C; /* 使能接收中断;使能Tx,Rx *//* SCIASR1, SCIACR1, SCIACR2, SCISR1, SCISR2, SCIDRH & SCIDRL left at default values */ }//串口波特率设置void SCI0_BR(unsigned long br){uint brPrescaler;brPrescaler = (uint)(24000000 / (16 * br));/* Set the Baud Rate */SCI0BDH = (uchar)((brPrescaler>>8));SCI0BDL = (uchar)(brPrescaler);}//串口发送字节void SCI0_SendByte(char ch){/* check SCI transmit data register is empty */while(SCI0SR1_TDRE == 0);SCI0DRL = ch;}//串口中断#pragma CODE_SEG __NEAR_SEG NON_BANKEDvoid interrupt VectorNumber_Vsci0 SCI0_ISR(void){SCI0CR2_RIE=0;while(SCI0SR1_RDRF == 0);SCI_Rev = SCI0DRL;SCI_Flag = 1;SCI0CR2_RIE = 1;}#pragma CODE_SEG DEFAULTADC应用程序#include <hidef.h> /* common defines and macros */#include "derivative.h" /* derivative-specific definitions */// 函数声明void ADC_Init(void);uint ADC_GetValue(byte ch);void Service_WD(void);void SetBusClock_24MHz(void);void Delay(void);// 全局变量uint AD_Result;uint AD_Result2;void main(void) {/* put your own code here */SetBusClock_24MHz();ADC_Init();EnableInterrupts;for(;;) {_FEED_COP(); /* feeds the dog */AD_Result = ADC_GetValue(7);AD_Result2 = ADC_GetValue(0);} /* loop forever *//* please make sure that you never leave main */// AD初始化void ADC_Init(void){ATDCTL1 = 0x3F; /* 10-Bit resolution ,discharge before sampling. */ATDCTL3 = 0x88; /* Right Justified Data, Single conversion sequence */ATDCTL4 = 0xE1; /* 6 MHz, Notice: 12MHz Max ATD Clock, Fatdlk = FBUS/(2*(PRS+1)) *//* 26 ATD Clock cycles sample time */}// ADC通道采集uint ADC_GetValue(byte ch){ATDCTL5 = 0x0F & ch; /* Start Continuous Conversions on ch */while (!ATDSTAT0_SCF); /* wait for conversion sequence to complete */return ATDDR0;}// 看门狗void Service_WD(void){CPMUARMCOP = 0x55;CPMUARMCOP = 0xAA;}void SetBusClock_24MHz(void){CPMUOSC_OSCE = 1; /* enable ext osc *//*Initialise the system clock from a 16 MHz Crystal,24 MHz Bus CLK (48 MHz VCO, 48 MHz PLL)*/CPMUSYNR = 0x00 | 0x05; /* VCOFRQ[7:6], SYNDIV[5:0] */CPMUREFDIV = 0x20 | 0x03; /* REFFRQ[7:6], REFDIV[3:0] */CPMUPOSTDIV = 0x00; /* POSTDIV = 0 FPLL = FVCO */while(!CPMUFLG_LOCK); /* wait for VCO to stabilize*/ Service_WD();CPMUCLKS_PLLSEL = 1; /* Switch clk to use PLL */ }void Delay(void){uint dummy_ctr;for(dummy_ctr=0; dummy_ctr<0x007f;dummy_ctr++){;}}。
飞思卡尔单片机 DG128 PWM 应用实例
![飞思卡尔单片机 DG128 PWM 应用实例](https://img.taocdn.com/s3/m/dfbb70791711cc7931b716a8.png)
HCS12微控制器系列教程(八)---PWM 应用实例PWM 初始化步骤总结1、禁止PWM PWME = 02、选择时钟 PWMPRCLK,PWMSCLA,PWMSCLB,PWMCLK3、选择极性 PWMPOL4、选择对齐方式 PWMCAE5、选择占空比和周期 PWMDTYx, PWMPERx6、使能PWM PWME = 1【例程1】程序描述:由通道PTP3口输出频率为1K,占空比为50%的方波程序如下:#include <hidef.h> /* common defines and macros */#include <mc9s12dg128.h> /* derivative information */#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"/***********初始化函数*************//*时钟初始化程序*/void PLL_Init(void) //PLLCLK=2*OSCCLK*(SYNR+1)/(REFDV+1){ //锁相环时钟=2*16*(2+1)/(1+1)=48MHzREFDV=1; //总线时钟=48/2=24MHzSYNR=2;while(!(CRGFLG&0x08));CLKSEL=0x80; //选定锁相环时钟}/*PWM初始化程序*/void PWM_Init(void){PWME_PWME3=0x00; // Disable PWM 禁止PWMPRCLK=0x33; // 0011 0011 A=B=24M/8=3M 时钟预分频寄存器设置 PWMSCLA=150; // SA=A/2/150=10k 时钟设置PWMSCLB=15; // SB=B/2/15 =100k 时钟设置PWMCLK_PCLK3=1; // PWM3-----SB 时钟源的选择PWMPOL_PPOL3=1; // Duty=High Time 极性设置PWMCAE_CAE3=0; // Left-aligned 对齐方式设置PWMCTL=0x00; // no concatenation 控制寄存器设置PWMPER3=100; // Frequency=SB/100=1K 周期寄存器设置PWMDTY3=50; // Duty cycle = 50% 占空比寄存器设置 PWME_PWME3=1; // Enable PWM 使能}/**********主函数**************/void main(void){PLL_Init();PWM_Init();/* put your own code here */EnableInterrupts;for(;;) {} /* wait forever *//* please make sure that you never leave this function */}。
飞思卡尔智能车S12XS128PWM控制程序编写
![飞思卡尔智能车S12XS128PWM控制程序编写](https://img.taocdn.com/s3/m/f41a78729a6648d7c1c708a1284ac850ad0204b1.png)
飞思卡尔智能车S12XS128PWM控制程序编写SeptStringS原创,转载请注明。
对于飞思卡尔智能车,电机和舵机的控制通常使⽤的都是以PWM脉冲宽度调制的⽅法实现的,其可⾏性基于电机可以由占空⽐控制转速,⽽舵机也由脉宽控制摆动。
PWM 调制波有 8 个输出通道,每⼀个输出通道都可以独⽴的进⾏输出。
每⼀个输出通道都有⼀个精确的计数器(计算脉冲的个数),⼀个周期控制寄存器和两个可供选择的时钟源。
每⼀个 PWM 输出通道都能调制出占空⽐从 0—100% 变化的波形。
PWM控制程序的编写⼀般按照以下的⼀种流程:1,禁⽌PWM模块;//这是由于改变周期和脉宽等操作需要在PWM禁⽌的情况下才能被设置2,PWM级联选择,是否级联通道67,45,23,01;//最多单独使⽤8个8位和级联使⽤4个16位3,给通道选择时钟源控制位;//0,1,4,5通道可选择ClockA和ClockSA;2,3,6,7通道可选择ClockB和ClockSB4,给时钟源A\B预分频;//可对总线时钟进⾏预分频,确定ClockA和ClockB,满⾜1,2,4,8,16,32,64,128这8个分频量5,根据时钟源A\B确定时钟源SA\SB;//由ClockA和ClockB、分频设值来确定ClockA和ClockB,满⾜1-255的分频量6,输出极性的选择;//也就是选择输出极性先低后⾼还是先⾼后低7,对齐⽅式的选择;//可设置为左对齐或者中间对齐⽅式8,实际通道频率的计算;//也就是周期的设定9,占空⽐寄存器的设置;//占空⽐常数的设定,可以以此决定占空⽐10,使能PWM模块。
//你已经⾸尾呼应了,有⽊有接下来通过寄存器的介绍,以上⾯流程为⼤纲,详细地说明⼀下该如何操作~~【PWME】寄存器PWME = (PWME~7 | PWME~6 | PWME~5 | PWME~4 | PWME~3 | PWME~2 | PWME~1 | PWME~0)将每⼀位设置为1即可使能该位,0对应的既是禁⽌。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
飞思卡尔单片机mc9s12dg128的pwm参考程序大学生参考网发表时间:10月13日 17:44 提交:demon
#include <> /* common defines and macros */
#include <> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"
/*
***
*pwm初始化函数北华大学王盼宝by demon 2007-5-12
***/
void pwm_initial()//pwm初始化函数
{
PWME=0x22;//通道01,45使能?
PWMPOL=0x22;//通道01,45输出波形开始极性为1
PWMCTL=0x50;//通道01,45级联
PWMCLK=0x02;//通道01选择SA为时钟源
PWMSCLA=0X04;//通道01时钟SA为3MHz(24/(2*4))
PWMPER01=60000;//设定通道01输出频率(50Hz)
PWMPER45=12000;//设定通道45输出频率(2KHz)
}
/*
***
*pwm输出函数by demon 2007-5-12
*程序描述;由输入参数向舵机和电机输出相应pwm
*参数:舵机方向:3300-5700 速度:0-12000
***/
void pwm(int speed,int direction)//pwm
{
pwm_initial();
if(direction<3300) direction=3300;?
if(direction>5700) direction=5700;?
PWMDTY01=direction;
if(speed>12000) speed=12000;
PWMDTY45=speed;
}
飞思卡尔单片机mc9s12dg128的io口初始化参
考程序
大学生参考网发表时间:10月13日17:47 提交:demon
#include <> /* common defines and macros */
#include <> /* derivative information */
#pragma LINK_INFO DERIVATIVE "mc9s12dg128b"北华大学王盼宝
void main()
{ DDRA=0x00;
DDRB=0xFF;
PUCR=0x02;?
while(1)
{
PORTB=PORTA;
?
}
EnableInterrupts;
for(;;) {} /* wait forever */
/* please make sure that you never leave this function */
}
飞思卡尔单片机mc9s12dg128的ad初始化参考程序void AD(void)
{
word t0=0;
word t1=0;
word t2=0;
word t3=0;
word t4=0;
word t5=0;
word t6=0;
word t7=0;
while(ATD0STAT0_SCF)
{
t0=ATD0DR0;
ad00= (byte)(t0>>8);//高8位移到低8位且高8位为0
t1=ATD0DR1;
ad01= (byte)(t1>>8);
t2=ATD0DR2;
ad02= (byte)(t2>>8);
t3=ATD0DR3;
ad03= (byte)(t3>>8);
t4=ATD0DR4;
ad04= (byte)(t4>>8);
t5=ATD0DR5;
ad05= (byte)(t5>>8);
t6=ATD0DR6;
ad06= (byte)(t6>>8);
t7=ATD0DR7;
ad07= (byte)(t7>>8); }。