I don't know how you are operating your counter/timer, but you should run it at a "fast enough" counter rate. If possible, use it so that a copy (snapshot) is taken by the peripheral hardware when the pin changes state as well as producing an interrupt event. This way, your value is very accurate. Set things up so that this takes place on either transistion of the pin, too. And then just let the counter freerun, recording the snapshot values as they come in.
It's the responsibility of your software to grab a copy before it gets overwritten by the next event and to check for overwriting, if it happens (which it may, if the duty cycle is close to 0% or 100%.) This way you can at least recover in your state machine algorithm and provide reasonable output values. Also, you must deal with rollover of the counter. That's also your job.
Clearly, you compute the total period from the difference of values that are two pin-change events apart. It's best that you set up an IIR filter on that value so that you can squeeze out noise from it, too. And you compute the duty cycle by comparing the difference between adjacent values against this filtered period.
With an MSP430, where the A2, A3 or B7 timer counter system can easily handle these tasks, you should be able to handle signal frequencies very much higher than 10Hz. With low resolution into the MHz, perhaps.
I'm just guessing, but I suspect you are borrowing someone else's software. Otherwise, you'd know exactly why you aren't getting better results. So it's hard to provide suggestions when you aren't directly engaged in the process.