完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
31个回答
|
|
用Time_A或者Time_B
|
|
|
|
|
|
|
|
童鞋,你问对人了。
正弦表的生成有两种办法 1.利用matlab:程序如下: fs=195; %设定采样频率 N=195; %采样点数为195 n=0:N-1; t=n/fs; f1=1; %这个f1可以不要 x=round(1875*(1+(0.8*sin(2*pi*f1*t)))); %生成正弦信号,并取整 plot(t,x) x就是比较寄存器的值,总共195个,下溢中断赋值就行了 2.方法二是在dsp中产生正弦表,计算占空比,计算比较寄存器的值 核心程序如下: while (n<=195) { q=n*2*PI; q/=195; j=sin(q); l=1875*(1+M*j);//M为调制比 //计算占空比表达式 if(l>=375&l<=3375) sin_table[n]=l; else { if(l>3375) sin_table[n]=3375; else sin_table[n]=375; } n=n+1; } 具体吧!这些程序都是我编的,我就是这么做的。两种都可以。 |
|
|
|
您好!我现在要生成spwm波,但是不知道占空比怎么计算?载波pWM的频率是40KHZ,调制信号正弦波的频率是2KHZ,pWM的幅度是从0-3.3V。不知道有没有相关的计算公式? |
|
|
|
|
|
|
|
按正弦表来刷TACCRx的值。占空比100%就是1,50%就是0,0%就是-1,按照正弦表的值计算占空比,再计算TACCRx的值
|
|
|
|
楼主 写好了吗 ?不知道你写了关于 PI校正以后的SPWM吗?交流一下
|
|
|
|
给你个软件 我也是从论坛下载的
|
|
|
|
|
|
|
|
很久没登了 我去年写的 你们参考一下吧
430单片机 #include int n=0; int flag = 1; int spwm[256]= { 1 , 5 , 9 , 13 , 17 ,21 , 24 , 28 , 32 , 36 , 40 , 43 , 47 , 51 , 55, 58 , 62, 66 , 70 , 73 , 77 , 81, 85 , 88 , 92 , 96, 99 , 103, 106 , 110 , 114 ,117, 121, 124, 128 , 131 , 135 , 138, 141 , 145 ,148 ,152 , 155 , 158 , 162 ,165 , 168 , 171 , 174, 178 , 181, 184 ,187 , 190, 193, 196, 199 , 202 , 205 , 208 , 210 ,213 , 216, 219, 221 , 224 , 227 , 229, 232 ,234 , 237 , 239 , 242 , 244 , 247 , 249 , 251 , 253 , 256 , 258 , 260 , 262 , 264 , 266 , 268, 270 , 272 , 274 , 276 , 277 , 279 , 281 , 282 , 284 , 285 , 287 , 288 , 290, 291, 293 ,294, 295, 296 , 297 ,299, 300, 301 , 302, 303 , 303 , 304 , 305 , 306 , 307 , 307 , 308 , 308 , 309, 309, 310 , 310 , 311 , 311 , 311 , 311 , 311, 311, 311 , 311 , 311 , 311 ,311 , 311 , 311 , 311 , 310, 310 , 309 , 309, 308 , 308 , 307, 307, 306, 305 ,304 , 304 , 303 , 302 , 301 , 300, 299 , 298, 296 , 295 , 294 ,293 , 291 ,290 , 289, 287 ,286 , 284 ,282 , 281 ,279 , 277 , 276, 274 , 272, 270 , 268 , 266 , 264 , 262 , 260 , 258 , 256, 254 , 251, 249 , 247 , 244 , 242 , 240, 237 , 235, 232 , 229, 227 , 224 ,222 , 219, 216 ,213, 211 , 208 ,205 , 202, 199, 196 , 193 , 190 ,187, 184 , 181 , 178 , 175 ,171 , 168 , 165 , 162 , 158, 155 , 152 ,148 , 145 , 142, 138 , 135 , 131, 128 ,124, 121 , 117 , 114, 110 , 107 , 103, 99 , 96 ,92 , 88 , 85 , 81 , 77 , 74, 70, 66 , 62 , 59 , 55 , 51 , 47 , 44 , 40 , 36, 32 , 28 , 25 , 21, 17 , 13 , 9 , 5, 2 }; void TimerB_Init() { P4SEL |= BIT2; // Set for Timer A1 P4DIR |= BIT2; P4SEL |= BIT1; // Set for Timer A1 P4DIR |= BIT1; TACCR0 = 312; TBCCR0 = 312; // Init TACCR0 w/ sample prd=CCR0+1 TBCCR1 = 0; TBCCR2 = 0; TBCCTL1 = OUTMOD_7; // Set/reset TBCCTL2 = OUTMOD_7; // Set/reset CCTL0= CCIE; TBCTL = TBCLR + MC_1 + TBSSEL_2; // clear TAR, up mode*/ TACTL = TACLR + MC_1 + TASSEL_2; // clear TAR, up mode*/ } void ini_sys(void) { BCSCTL1 &= ~XT2OFF; // XT2on do { IFG1 &= ~OFIFG; // Clear OSCFault flag for (char i = 0xFF; i > 0; i--); // Time for flag to set } while ((IFG1 & OFIFG)); // OSCFault flag still set? BCSCTL2=SELM_2+SELS; } void main() { WDTCTL=WDTPW+WDTHOLD; ini_sys(); TimerB_Init(); _EINT(); while(1) { if( flag == 1) { TBCCR2 = 0; TBCCR1=spwm[n]; } else { TBCCR1 = 0; TBCCR2 = spwm[n%256]; } } } #pragma vector=TIMERA0_VECTOR __interrupt void TimerA(void) { n++; if((n%256) == 0) { flag = 1- flag; } if(n == 512) { n = 0; } } |
|
|
|
|
|
|
|
|
|
|
|
可不可以留下联系方式,如qq,有问题请教。 |
|
|
|
|
|
|
|
直接建立一个数组复制进去啊
|
|
|
|
|
|
|
|
l=1875*(1+M*j),你这里的1875是怎么来的,还有后边的那个375和3375,这些值是怎么计算出来的 |
|
|
|
谢谢楼主,赞一个~
|
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
|
只有小组成员才能发言,加入小组>>
2915个成员聚集在这个小组
加入小组2665 浏览 1 评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
2969 浏览 2 评论
请问怎么把下面51单片机的代码改成msp430 g2 pocket的代码,还有改下时间变成30秒
2260 浏览 1 评论
4686 浏览 1 评论
2471 浏览 1 评论
927浏览 3评论
MSP430FR5994 使用库函数 定时器触发AD问题请教
2969浏览 2评论
2665浏览 1评论
1059浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-8-18 21:24 , Processed in 1.418712 second(s), Total 84, Slave 76 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191