- #include <msp430x54x.h>
- unsigned int results[5]; // 转换值存取变量
- long fliter0(long *, int);
- void main(void)
- {
- int cnt = 0;
- unsigned int i;
- WDTCTL = WDTPW+WDTHOLD; // 关闭看门狗
- P7SEL |= 0x03; // 使能时钟端口
- UCSCTL6 |= XCAP_3; // 配置晶振电容
- UCSCTL7 &= ~(XT1LFOFFG + DCOFFG); // 清除失效标志位
- SFRIFG1 &= ~OFIFG; // 清除失效中断标志位
- UCSCTL4 = SELM__DCOCLK + SELS__DCOCLK; // 选择时钟源
- //UCSCTL4 = SELM_7 + SELS_2; // 选择时钟源
-
- P6DIR &= ~(BIT1 + BIT2 + BIT3); // P6.7口A7输入
- P6SEL |= (BIT1 + BIT2 + BIT3); // P7口第二功能
- P4DIR |= BIT0;
- P4DIR |= BIT1;
- P4DIR |= BIT2;
-
- ADC12CTL2 = ADC12RES_2 + ADC12REFOUT; // AD基本配置
- ADC12CTL0 = ADC12ON + ADC12MSC + ADC12SHT01 + ADC12REFON + ADC12REF2_5V;
- ADC12MCTL0 |= ADC12INCH_1; // 通道1输入
- ADC12MCTL1 |= ADC12INCH_2; // 通道2输入
- ADC12MCTL2 |= ADC12INCH_3; // 通道3输入
- ADC12MCTL3 |= ADC12INCH_2; // 通道2输入
- ADC12MCTL4 |= ADC12INCH_3 + ADC12EOS; // 通道3输入
- ADC12CTL1 = ADC12SHP + ADC12CONSEQ_3; // 选择转换模式
- for (i=0;i<0xFFFF;i++); // 等待基准电压建立
- UCSCTL8 |= MODOSCREQEN;
- ADC12IE |= 0X08; // 使能通道4中断
- ADC12CTL0 |= ADC12ENC; // 开启转换
- _EINT(); // 打开总中断
- ADC12CTL0 |= ADC12SC; // 转换开始
- LPM3; // 进入低功耗3
-
- }
- #pragma vector = ADC12_VECTOR
- __interrupt void ADC12ISR(void)
- {
-
- unsigned int i;
- unsigned int j;
- results[0] = ADC12MEM0; // 保存第一通道值
- results[1] = ADC12MEM1; // 保存第二通道值
- results[2] = ADC12MEM2; // 保存第三通道值
- results[3] = ADC12MEM3; // 保存第四通道值
- results[4] = ADC12MEM4; // 保存第五通道值
-
- /*
- 程序部分
- */
-
- P4OUT ^= BIT0;
- for(i = 0; i < 10000; i++);
- }
复制代码
主程序部分就不写了,我通过for(i = 0; i < 10000; i++);完成之后翻转P4.0的方式来估计计算的时间,程序运行实际输出方波频率21Hz,for语句一次累加是5个机器周期,那么计算频率为:21*2**5*10000=2MHz,但是我用的是16M的晶振啊,我的程序为什么这么慢啊(只有AD12的话输出是10kHz,也不是AD的时间太长),分频什么的设置我不懂啊,我就想程序的计算频率再高一点,那么我应该怎么设置啊?
此帖出自
小平头技术问答
问题解决了,主要是因为使用的芯片是MSP430F5438A,貌似和网上很多的例程是不一样的,很多的程序写进去直接提示各种宏定义没有。。所以程序也根本写不进去,更别说调试了。
在
- UCSCTL6 |= XCAP_3; // 配置晶振电容
复制代码之后加了两句:
- UCSCTL1 = DCORSEL_4; // 选择DCO的范围
- UCSCTL2 |= 240; // 设置DCO频率为16M
复制代码但也不能说解决了问题,因为我使用的晶振是16M的,然后设计了一次5W次机器周期的程序翻转P4.0的输出,也就是测试的输出方波周期是10W次机器周期的视角,
按理说DCORSEL_0、DCORSEL_1、DCORSEL_2、DCORSEL_3之类的应该是表示DCO时钟的1/2/3/4分频,或者是1/2/4/8分频才差不多,但是实际测试的结果为:
- 配置 - 输出频率 - DCO频率 - 分频
- DCORSEL_0 - 11Hz - 1M - 16
- DCORSEL_1 - 22Hz - 2M - 8
- DCORSEL_2 - 49Hz - 5M - 3.5??
- DCORSEL_3 - 92Hz - 9M - 11/6??
- DCORSEL_4 - 169Hz - 16M - 1
- DCORSEL_5 - 169Hz - 16M - 1
- DCORSEL_6 - 0Hz - 0 - /
- DCORSEL_7 - 0Hz - 0 - /
复制代码且不说6、7为什么是0。。0、1对应的是1M和2M的频率还是好理解的,但是49Hz和92Hz是怎么出来的。。我就是在想不通了,169Hz对应的计算频率是16M,应该已经是电路的极限了,但是分2次频的话也应该是84Hz啊,92Hz是怎么来的?
一周热门 更多>