|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
本帖最后由 Ele_insect 于 2022-9-26 16:04 编辑 . o+ M) E# Z. d: o9 Y0 k4 u
" E/ k: s$ J! z+ T' ^6 k- Y#include <msp430x14x.h>/ D2 }+ ^$ ^, z1 k- M
#include * ~- p2 V$ p/ N9 x; [
#define uchar unsigned char
' V2 x) X. d6 V4 H2 U! V#define uint unsigned int
l+ o5 z$ Z% p; Q. @2 u7 {#define CPU_F ((double) 8000000.0)//当前CPU主频
" E9 p- u1 B8 z6 ?2 c* ?9 v#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
}" V6 ^) N2 a. D#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))
6 i. U3 I) P" | q+ xuint sintable[]={255,246,239,225,213,200,180,162,130,122,108,95,80,59,39,28,17,10,3,1,3,10,
+ M1 N+ h# w: t3 Y5 T6 |17,28,39,59,80,95,108,122,130,162,180,200,213,225,239,246,255};( }- K" P* a, s* D+ C" ~; ~0 W
uint t=0;/ ?! X4 G9 ~* F! V
void Init_clk()//时钟初始化" t: c) m8 l" e& \3 d5 {
{; M+ \- c# f, P' d: U
uchar i;7 l9 |+ e: M1 T) f5 D
BCSCTL1 &=~XT2OFF;//(置TX2=0)使TX2有效,默认是关闭的
6 o1 K9 ?* e1 O, z do
7 W" {/ U8 L4 Y& u {0 U) [! K4 L/ u% c# V4 U( Q: z
IFG1 &= ~OFIFG;//清振荡器失效标志
) z1 y, e z* k) _ for(i=0xff;i>0;i--);
4 E2 H& }: {! h, Z }while((IFG1 & OFIFG)!=0); //若振荡器失效标志有效
T0 `! ^. I0 \ w" P: b4 D BCSCTL2|=SELM_2+SELS+DIVS_2; //使MCLK=XT2=8M,SMCLK经过4分频,则SMCLK=2M
w/ D2 H5 W* s}- p* h' x- D- r V/ g5 a5 ?
void main(void)4 A, |7 f# O, h4 J# r( [
{
( y, j% N* t+ i! A; [& k9 l WDTCTL = WDTPW + WDTHOLD; / m0 i8 `/ c0 R6 B
Init_clk(); //时钟初始化
$ h; E- O1 E' w' [8 Y' M4 S9 B P4DIR |= 0x07; // P4.0 - P4.2 输出, M4 O9 O! p; K2 E
P4SEL |= 0x07; // P4.0 - P4.2 第二功能(PWM输出)/ o8 b7 Y# A9 q9 Q% P& v' d
TBCTL = TBSSEL_2 + MC_1; // SMCLK,增计数模式
/ M4 h- i6 ~) r TBCCTL0 |=CCIE; //CCR0比较模式,打开中断
a' a7 n, @' Y* y4 p) y8 J TBCCR0 = 255; //PWM周期 7 y; M0 z- [* f9 b- A* X
+ Z# l; p2 A/ c/ c
TBCCTL1 = OUTMOD_7; //选择输出模式7,当TBR计数到0时,CCRx数据加载到TBCTLx中 6 F$ C8 R* \9 L$ Y" p4 e- ~
TBCCTL2 = OUTMOD_7; , y$ t4 I; b3 Y! I* U/ V
+ Z2 c4 V' T2 w1 D) t# z9 h
TBCCR1 =sintable[t];
7 l0 L0 a% R3 H TBCCR2 = 128; //占空比128/255=50% 2 _0 g3 L6 n% Z3 u% H; h# s
while(1)
! x! x: u4 m7 Y3 ?' q {
+ U7 b9 r: \; O. B6 M$ B) e _EINT();//打开总中断; r1 k; I; N& C1 X) [) |) d) w
}, M* M& I6 C) }4 y7 K1 M. [# r8 n
}
; t$ {) D5 a0 Y8 q4 |3 T/ O#pragma vector=tiMERB0_VECTOR
" ?2 n' L/ ]! u1 ^__interrupt void timerB()
! Z) ^+ i* i2 ]9 ~{" k# a/ g5 b* w0 {! |* J
t=(t+1)%39;
1 a' P' R1 P8 v8 `8 z3 I TBCCR1=sintable[t];//将新的抽样值装入TBCCR18 V+ Z' U. H# z3 B+ t' x3 f- x
}
, F) A3 v' o1 G; l9 G. g5 H
9 P# j! r7 {4 i) {* n! Y- C: `/ X2 L9 R3 F6 A" g% l8 ~( o
|
|